十六进制转储(字节数组)包含非标准字符如何转换为整数

3

我正在尝试将字节/十六进制字符串转换为整数。

我有一个从串口读取器返回的数据文本日志,这与辐射有关。 日志记录如下:

<20110805104053.421>
#00#00#64#05#00#00#00#00#00#00#3C#00#00#0D#0A
<20110805104055.421>
#00#00#5AÉ#00#00#00#00#00#00#3C#00#00#0D#0A
20110805104057.421>
#00#00#60÷#00#00#00#00#00#00#3C#00#00#0D#0A
<20110805104059.421>
#00#00#59#1C#00#00#00#00#00#00#3C#00#00#0D#0A
<20110805104101.421>
#00#00#5D#56#00#00#00#00#00#00#3C#00#00#0D#0A
<20110805104103.421>
#00#00#5D#09#00#00#00#00#00#00#3C#00#00#0D#0A

格式:

<TIMESTAMP (YYYY,MM,DD,HHMMSS.SS)>
DATA

在这种情况下,只使用前4个哈希值的数据:

#00#00#5D#56

通过格式化字符串和使用代码:
>>> logdata = b'\x00\x00\x5D\x56'
>>> struct.unpack(">l", logdata)
(23894,)
>>> int(binascii.hexlify(bytearray(logdata)),16)
result: 23894

这些数字是预期的,但有时字符串保存在特殊字符中:

<20110805104055.421>
#00#00#5AÉ#00#00#00#00#00#00#3C#00#00#0D#0A

使用与上述相同的set方法,我将前4个转换为:

 #00#00#5AÉ#00   or  ('\x00\x00\x5AÉ\x00')

预期结果是(来自http://www.asciitohex.com/):
23040 

我的第一个结果是:

5949696

原本的数据是错误的,所以我将字节调整为'\x00\x00\x5AÉ'并重新运行,结果如下:

23241

非常接近23040,但不是23040???这在一系列数字中相当可重复,但不正确。当不使用特殊字符时,我的结果与预期相符,并在asciitohex网站上转换。

1个回答

1

É 的十六进制为 C9。

0x5AC9 相当于 23241。

如果是 È(十六进制为 C8),则会得到 23240。

[请参见 http://www.pjb.com.au/comp/diacritics.html]

看起来有时候,当十六进制可以被解释为可打印字符,比如 É,该字符会输出而不是十六进制。在 "#00#00#5AÉ#00" 的情况下,你不要字符串 '\x00\x00\x5AÉ\x00',因为这是五个字节而不是四个(你可以知道这一点,因为在你获取所需内容后应该还剩下 11 个字节而不是 10 个),你只需要 '\x00\x00\x5AÉ'=5AC9。


那么网站asciitohex.com如何将x00\x00\x5AÉ\x00解释为23040?问题在于,我正在与已转换的辐射值图表进行比较,而23040也是其得出的结果。 - Royalke
我不确定为什么那个网站告诉你那个。你到底输入了什么内容到网站表格中才得到23040? - hft
此外,我还要说,“转换后的值”QA/QC是错误的,你的方法是正确的(一些值#00#00Ÿñ#00会变成0)。 - Royalke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接