Python将字节分成高和低半字节

Spa*_*her 1 python pyserial nibble

我试图使用pyserial发送和接收rs232数据,但我不明白如何正确发送正确的数据.我有什么小信息解释数据字符串并说它应该分成高和低半字节.转换为半字节是我没有得到的部分,我试图阅读它但是没有得到如何使用它为我的情况.

所以我有这个数据字符串通过串口发送.10,00,00,00,00,00,16,0A,20,20,20,20,00,00,00,00,00,00,00,00,50

它表示将字节分成高半字节和低字节,然后将21个字节转换为42个字符的数据字符串.

有人可以帮我解释一下如何为我做这个吗?

Val*_*tin 6

如果你想得到一个字节的高和低半字节.换句话说,将8位分成4位.

考虑到数据字符串是十六进制的字节字符串,那么您可以简单地执行:

high, low = byte[:1], byte[1:2]
print(high, low)
Run Code Online (Sandbox Code Playgroud)

哪个byte = "16"会打印1 6.然后int(high, 16),您可以使用并将int(low, 16)其转换为小数.

如果您已经将十六进制转换为十进制,int(byte, 16)那么您可以通过执行以下操作来提取高和低半字节:

high, low = byte >> 4, byte & 0x0F
print(hex(high), hex(low))
Run Code Online (Sandbox Code Playgroud)

byte = 0x16打印哪个0x1 0x6因为它们被转换回十六进制使用hex(x).请注意,hex(x)添加0x前缀.您可以通过执行删除它hex(x)[2:].

所以考虑你的数据字符串:

bytes = "10,00,00,00,00,00,16,0A,20,20,20,20,00,00,00,00,00,00,00,00,50"
Run Code Online (Sandbox Code Playgroud)

然后打印每个高低蚕食可以这样做:

bytes = "10,00,00,00,00,00,16,0A,20,20,20,20,00,00,00,00,00,00,00,00,50"
bytes = bytes.split(",")

for byte in bytes:
    byte = int(byte, 16)
    high, low = byte >> 4, byte & 0x0F

    print(hex(byte), hex(high), hex(low))
Run Code Online (Sandbox Code Playgroud)

这产生十六进制的字节,高半字节和低半字节.

此外,如果你在bits("{0:08b}".format(byte))中有它,那么你可以像这样分割它high, low = bits[:4], bits[4:8],现在high, low每个都有它们的4位.