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