Python BCD拆分半字节和串联2整数

时间:2012-04-18 13:26:42

标签: python string hex bcd

我觉得这是一个发布这个的完整工具,它是如此基本,我不能相信我已经浪费了这个问题的最后两天。我已经尝试了所有我能找到的解决方案(严肃地说,我会告诉你我的网络历史),但无济于事。这是问题所在:

我正在从uC解析一个串行字符串。它长52个字节,包含许多不同的数据变量。数据采用压缩二进制编码的十进制编码。

例如:.....blah.....0x01 0x5E .....blah

015E hex给出350十进制数。这是我想要的价值。我正在阅读串行字符串就好了,我用binascii.hexifiy打印字节以确保它是正确的。我用

data = ser.read()

如果未收到换行符,则将数据放入数组中。我试过让数组成为一个bytearray,list,我能找到的任何东西,但都没有用。

我想将所需的两个字节部分发送到已定义的方法。

def makeValue(highbyte, lowbyte)

当我尝试使用解包,加入,打包,位操作,字符串集中时,我不断遇到同样的问题。

因为0x01和0x5E不是有效的int数字(标题的开头和ASCII中的^),所以它不起作用。它甚至不会让我加入数字,因为它不是一个有效的int。

using hex(): hex argument can't be converted to hex. Joining the strings: invalid literal for int() with base 16: '\x01^' using int: invalid literal for int() with base 10: '\x01^' Packing a struct: struct.error: cannot convert argument to integer

说真的,我错过了一些非常基本的东西吗?我能找到的所有例子都完美地利用了上述所有函数,但它们特定了十六进制数'0x1234',或者它们转换的数字是实际的ASCII数字。请帮忙。

修改 我明白了,ch3ka让我走上正轨,感谢百万!

我不知道为什么以前它不会起作用但是我把这两个值都诅咒了

one = binascii.hexlify(line[7])
two = binascii.hexlify(line[8])
makeValue(one, two)` 

然后使用char makeValues ch3ka定义:

def makeValue(highbyte, lowbyte)
    print int(highbyte, 16)*256 + int(lowbyte, 16)

再次感谢!!!

1 个答案:

答案 0 :(得分:1)

您将值解释为字符。向int()提供字符不起作用,您必须将值作为字符串提供,如下所示:int("0x5E", 16)。您尝试的实际上是int(chr(int("0x5E", 16)),16)int("^",16),当然不会有效。

您是否期望这些结果?

makevalue('0x01', '0x5E') ->  350 0x15e 0b101011110
makevalue('0xFF', '0x00') ->  65280 0xff00 0b1111111100000000
makevalue('0x01', '0xFF') ->  511 0x1ff 0b111111111
makevalue('0xFF', '0xFF') ->  65535 0xffff 0b1111111111111111

如果是这样,你可以使用:

def makeValue(highbyte, lowbyte):
    return int(highbyte, 16)*256 + int(lowbyte, 16)

或IMO更丑陋和错误:

def makeValue(highbyte, lowbyte):
    return int(highbyte+lowbyte[2:], 16) # strips leading "0x" from lowbyte be4 concat