【问题标题】:Convert element list to integer and shift to right将元素列表转换为整数并右移
【发布时间】:2016-03-29 09:21:27
【问题描述】:

我正在编写 python 代码,它一次从串行读取一个字节并将其存储到列表中。

接下来我需要结合两个字节来获得有效载荷长度。为了实现这个目标,我需要将长度的 MSB(最高有效字节)和 LSB(最低有效字节)转换为整数,然后移动 MSB。

这是我的列表:['H', '4', 'K', 'M', '0', '\x10', '\xff', '\x10', '\x00', ' \x02', '\xff', '\xff'].

MSB'\x02'LSB'\x00'

我将 MSB 和 LSB 存储在两个变量中,并尝试通过 int() 将其从字符串转换为 int:

payloadLenMSB_h = int(packetHeader[offsetPayloadLenMSB])
payloadLenLSB_h = int(packetHeader[offsetPayloadLenLSB])

但我收到此错误:

**ValueError: invalid literal for int() with base 10: ''**

我可以通过哪种方式将长度的MSB和LSB转换为int?

接下来我需要将 MSB 向右移动 8 位,并将其与 LSB 结合。

有什么建议吗?

这是我从串口读取数据的代码:

print 'Available data on COM Port: ' + str(availableSerialByte)
if availableSerialByte > 0:
    readByte = serialCOM.read(1)
    print 'Read COM byte:' + str(readByte)

谢谢!!!

【问题讨论】:

    标签: python serial-port bit-shift pyserial


    【解决方案1】:

    应该这样做:

    import struct
    payloadLenMSB_h = struct.unpack('B', packetHeader[offsetPayloadLenMSB])[0]
    payloadLenLSB_h = struct.unpack('B', packetHeader[offsetPayloadLenLSB])[0]
    payloadLen = payloadLenMSB_h << 8 + payloadLenLSB_h
    

    'B' 表示单个无符号字符,请参阅the struct docs&lt;&lt; 表示按位移位,一旦您的 MSB 已移位,您只需将其添加到 LSB。

    【讨论】:

    • 感谢您的回复!它工作正常! payloadLenMSB_h = ord(packetHeader[offsetPayloadLenMSB]) payloadLenLSB_h = ord(packetHeader[offsetPayloadLenLSB]) 正确吗?
    猜你喜欢
    • 2014-12-23
    • 2018-08-20
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 2014-07-29
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多