我正在尝试将一个字节/十六进制的字符串转换成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
格式:
^{pr2}$对于数据,在这种情况下,只使用前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
使用与上述相同的设置方法,我将前4个转换为:
#00#00#5AÉ#00 or ('\x00\x00\x5AÉ\x00')
预期结果是(从http://www.asciitohex.com/):
23040
我的第一个结果是:
5949696
这是错误的,所以我将字节调整为'\x00\x00\x5AÉ'
,然后再次运行,这会给我:
23241
很接近23040,但不是23040???通过一系列的数字,这是相当可重复的,但并不正确。当不使用特殊字符,我的结果是如预期和转换在Ascitohex网站。在
赤道是十六进制C9。在
0x5AC9为23241
如果它是È(十六进制C8),你会得到23240。在
[见http://www.pjb.com.au/comp/diacritics.html]
看起来,有时候,当十六进制可以解释为可打印字符(如а)时,输出的是该字符而不是十六进制。在“#00#00#00#5A#00”的情况下,您不需要字符串'\x00\x00\x5A#\x00',因为那是5个字节而不是4个字节(您可以分辨出来,因为在您抓取想要的而不是10个字节之后应该还有11个字节),您只需要'\x00\x00\x5A a#'=5AC9。在
相关问题 更多 >
编程相关推荐