【问题标题】:Python 3 - on converting from ints to 'bytes' and then concatenating them (for serial transmission)Python 3 - 从整数转换为“字节”然后将它们连接起来(用于串行传输)
【发布时间】:2013-09-05 15:19:10
【问题描述】:

经过多次徒劳的搜索......我在理解 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' 的明显方式?还是我的整个方法只是错误的方法? -_- 感谢您的宝贵时间。

【问题讨论】:

    标签: python python-3.x serial-port type-conversion byte


    【解决方案1】:

    您在这里混淆了 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 开头,后跟整数的十六进制表示。编码为仍为 4 个字节的 UTF8,例如,b'\x30\x78\x30\x31' 表示整数值 10,而b'\x10' 表示您想要的实际字节。

    【讨论】:

    • 谢谢。这让我发疯了。现在在我的桌子上放一个漂亮的颜色循环显示器:)
    • 嗯。它实际上在 IDLE 中给出了一个提示:如果你输入“bytes(”,弹出菜单显示“() bytes(iterable_of_ints) -> bytes”...应该点击“iterable”暗示我可以使用单项列表。-_- 最初我输入诸如“bytes(5)”之类的东西,想知道为什么我会从另一边得到 5 个空字节!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 2018-03-15
    相关资源
    最近更新 更多