在Python中将int数组转换为无符号字符数组

4
我尝试在我的树莓派上的2004液晶屏上定义一个新字符(一个大写德语umlaut "Ä"),使用wiringPi的lcdCharDef()
这是我的代码。
import wiringpi2 as wiringpi

# Ä
cap_umlaut_a = [
    int('0b01010', 2),
    int('0b00100', 2),
    int('0b01010', 2),
    int('0b10001', 2),
    int('0b11111', 2),
    int('0b10001', 2),
    int('0b10001', 2),
    int('0b00000', 2)
]

print(cap_umlaut_a) # [10, 4, 10, 17, 31, 17, 17, 0]

wiringpi.lcdCharDef(lcd_handle, 0, cap_umlaut_a)

当我运行这段代码时,我得到了以下错误:

TypeError: 在方法'lcdCharDef'中,第3个参数的类型为'unsigned char [8]'

我期望这些整数与无符号字符相同。 [编辑]
在代码的另一个部分,我使用ord(char)将只有一个字符转换为无符号整数。这会导致正确的答案吗?
如何将数组强制转换/转换为可以接受的类型?
附言(请注意(据我所了解),Python wiringPi库仅包装了wiringPi的C函数) [编辑]
我在github上提出了一个问题:https://github.com/WiringPi/WiringPi2-Python/issues/20

@PatrickMaupin 我认为 Unicode 不起作用,因为我必须自己定义新字符的像素(Hitachi HD44780U 液晶显示器不是很聪明 - 它们本身不知道大写分音符)。或者我理解错了吗?然而,chr() 不起作用,而 byte() 在 Python 中不是内置类型。 - speendo
@PatrickMaupin 是的。这会产生不同的错误:TypeError: 序列项 0:期望 str 实例,但找到了 int。 - speendo
是Python 2还是3? - Patrick Maupin
根据来源此处,它应该可以使用字节串工作。 - WorldSEnder
我认为当你进行转换时出现了错误--你必须连接(join())chr()。换句话说,如果你像上面那样定义一个整数列表,那么你应该能够单独执行cap_umlaut_a = ''.join(chr(x) for x in cap_umlaut_a)。看看这是否有效。 - Patrick Maupin
显示剩余11条评论
1个回答

1

我进行了一些研究,找到了相关Python绑定的来源在这个GitHub仓库中

问题所在的代码行是

res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_unsigned_char, 0 | 0 );

正如你所见,你需要传递Python中无符号字符的指针等效项。根据this thread,该等效项是字节字符串。这意味着正确的调用应该是:
import struct
wiringpi.lcdCharDef(lcd_handle, 0, struct.pack('8B', *cap_umlaut_a))

应该等同于:
wiringpi.lcdCharDef(lcd_handle, 0, b'\x0A\x04\x0A\x11\x1F\x11\x11\x00')

谢谢你的回答。我非常感激!我刚刚尝试了一下。wiringpi.lcdCharDef(self.lcd_handle, 0, b'\x0A\x04\x0A\x11\x1F\x11\x11\x0') 出现了一个错误 "ValueError: invalid \x escape",而 wiringpi.lcdCharDef(lcd_handle, 0, struct.pack('8B', *cap_umlaut_a)) 则出现了 "struct.error: pack requires exactly 8 arguments"。 - speendo
1
我修复了第一个错误,但是我无法重现第二个错误(使用您问题中的定义)。 - WorldSEnder
嗯,感谢您修复了第一个问题 - 我现在也看到了 :) 现在我在这里也遇到了 TypeError... 或许我的代码还有其他问题。我会尝试明天制作一个运行的最小示例,并发布它或接受您的答案,如果我能找到错误的话。 - speendo
@speendo,你可以尝试使用普通字符串而不是字节字符串吗?:< - WorldSEnder
我刚刚尝试了wiringpi.lcdCharDef(lcd_handle, 0, 'AAAAAAAA'),结果相同。我想我会在Github上询问维护者... - speendo
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接