Python BCD分裂半字节和并置2个整数

问题描述:

我觉得这是一个完整的发布工具,它是如此基本,我不能相信我浪费了这个问题的最后两天。我尝试了所有我能找到的解决方案(认真,我会告诉你我的互联网历史),但无济于事。这里是问题:Python BCD分裂半字节和并置2个整数

我解析来自uC的串行字符串。它的长度是52个字节,并且包含很多不同的数据变量。以包装二进制编码的十进制编码的数据。

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

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

data = ser.read()

并放置在数据阵列中的,如果没有接收到新行。我试图让这个数组成为一个bytearray,list,任何我能找到的东西,但都没有用。

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

def makeValue(highbyte, lowbyte)

当我尝试使用解包,连接,包,位操作,串concentation,我不断收到同样的问题。

由于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让我在正确的轨道上,感谢一百万!

我不知道为什么它不会工作之前,但我hex'ed两值

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

,然后使用makeValues ch3ka定义的字符:再次

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

谢谢! !

您正在将值解释为字符。喂字符为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 
+0

非常感谢你的帮助。不幸的是它仍然无法正常工作。当我尝试第一个makeValue时,我得到:'int()的无效字面值为16:'\ x01''第二个字符为int(),基数为16:'\ x015E''我想在十六进制的值,但仍然不允许? – 2012-04-18 14:04:24

+0

你不能通过“\”。只要传递“0x01”和“0x5E”即可。作为字符串。 – ch3ka 2012-04-18 14:24:13