0

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

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

前任:.....blah.....0x01 0x5E .....blah

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

data = ser.read()

如果没有收到换行符,则将数据放入数组中。我尝试将数组设置为字节数组、列表,以及我能找到的任何东西,但没有任何效果。

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

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)

再次感谢!!!

4

1 回答 1

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
于 2012-04-18T13:47:13.843 回答