带有非标准字符的十六进制转储(字节数组)到int

时间:2014-12-15 21:17:47

标签: python hex byte bytearray hexdump

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

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

<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 个答案:

答案 0 :(得分:1)

É是十六进制C9。

0x5AC9是23241

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

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

看起来有时,当十六进制可以被解释为像É这样的可打印字符时,输出该字符而不是十六进制。在“#00#00#5AÉ#00”的情况下,你不需要字符串'\ x00 \ x00 \x5AÉ\ x00',因为那是5个字节而不是4个字符(你可以知道,因为你抓住后应该剩下11个字节)你想要的不是10)你只想要'\ x00 \ x00 \x5AÉ'= 5AC9。