4

经过很多徒劳的搜索......我在理解 Python 3.2 中处理“字节”和十六进制内容的方式时遇到了一个非常具体的问题。我知道我误解了,但似乎找不到正确的路径。

我的最终目标是使用 python 串行模块来传输字节序列。有些字节是静态的,不会改变。其他的价值应该在 0-255 之间变化。所有这些都需要被混合在一起并立即传输。(这些是可编程显示器的指令。代码包含设置 BG 颜色的固定指令,后跟 R、G 和 B 值的每个字节。我试图在循环中循环通过颜色强度进行测试,但后来我'我希望能够为显示器上的实用功能做到这一点)。

一个完整的静态传输,测试成功,可能如下:

ser.write(b'\xAA\x11\x05\x00\x00\x00\xc3')  #this works great

同样,我可以将它们混合在一起,即:

ser.write(b'\xAA\x11\x05' + b'\x00\x00\x00\xc3')  #also works great

现在,如果我想取这三个零值字节之一,并用一个变量替换它,它就会变成梨形。经过大量实验后,我最终得到了一些据称将 For 循环的整数变量转换为与连接到上述字节系列兼容的类型:

SET_BG_COLOR = b'\xAA\x03\x03'
for r in range(0,255):
            red = hex(r).encode('utf-8')
            blue = hex(255-r).encode('utf-8')
            ser.write(SET_BG_COLOR + blue + b'\x00' + red + b'\xC3') #BGR format

hex(integer).encode('utf-8') 是迄今为止唯一的方法,它不仅会抛出关于无法连接到我试图关闭串行连接的其他东西的错误。但它不起作用,并且在查看结果时:

>>> x = b'\05'
>>> x
b'\x05'
>>> y = hex(5).encode('utf-8')
>>> y
b'0x5'
>>> type(x)
<class 'bytes'>
>>> type(y)
<class 'bytes'>
>>> x + y
b'\x050x5'   #(this is what I get)
>>> z = b'\05'
>>> x + z
b'\x05\x05'  #(this is what I want)
>>> 

看起来,虽然它可以让我连接......它是字符串数据的二进制表示,还是类似的?那么让我连接但它不是真正的十六进制值吗?我是否错过了从 x=255 到 x= b'\FF' 的明显方式?还是我的整个方法只是错误的方法?-_- 谢谢你的时间。

4

1 回答 1

7

您在这里混淆了 Python 字节文字语法;您不需要生成文字语法,只需生成字节值;该bytes()类型也接受整数序列:

>>> bytes([255])
b'\xff'

应用于您的代码:

SET_BG_COLOR = b'\xAA\x03\x03'
for r in range(0,255):
    red = bytes([r])
    blue = bytes([255 - r])
    ser.write(SET_BG_COLOR + blue + b'\x00' + red + b'\xC3') #BGR format

或者,更简单:

SET_BG_COLOR = [0xAA, 0x03, 0x03]
for r in range(0,255):
    ser.write(bytes(SET_BG_COLOR + [r, 0x00, 255 - r, 0xC3])) #BGR format

使用文字十六进制整数表示法。

演示r = 10

>>> SET_BG_COLOR = [0xAA, 0x03, 0x03]
>>> r = 10
>>> bytes(SET_BG_COLOR + [r, 0x00, 255 - r, 0xC3])
b'\xaa\x03\x03\n\x00\xf5\xc3'

hex()函数每字节输出 4 个字符;以文字0x开头,后跟整数的十六进制表示。例如,对于b'\x30\x78\x30\x31'整数值,编码为 UTF8 仍然是 4 个字节,而不是您想要的实际字节。10b'\x10'

于 2013-09-05T15:21:28.907 回答