Python将字节拆分为高和低低半字节

时间:2017-03-20 05:00:22

标签: 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个字符的数据字符串。

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

2 个答案:

答案 0 :(得分:5)

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

考虑到数据字符串是十六进制的字节字符串,那么您可以这样做:

high, low = byte[:1], byte[1:2]
print(high, low)

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

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

high, low = byte >> 4, byte & 0x0F
print(hex(high), hex(low))

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"

然后打印每个高低蚕食可以用这样的东西来完成:

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))

以十六进制形式产生字节,高半字节和低半字节。

此外,如果您有位("{0:08b}".format(byte)),那么您可以将其拆分为high, low = bits[:4], bits[4:8],现在high, low每个都有4位。

答案 1 :(得分:0)

我不知道答案现在是否对您有帮助,但是您也可以使用所谓的位掩码来解决此问题

例如,使用python从字符串的高半字节(hl)和低半字节(ln)中拆分每个字符:

input_text = "a fucking amazing input text"
for c in input_text:
  print(bin(ord(c)))
  nh = ord(c) & 0x0F
  nl = ord(c) >> 4 & 0x0F
  print("nh: " + bin(nh))
  print("nl: " + bin(nl))

为什么0x0F是00001111

例如:

掩码:00001111(0x0F) 价值:11010101 结果:00000101

希望还是有帮助的。