十六进制转储(字节数组)包含非标准字符到中

2024-03-29 07:36:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将一个字节/十六进制的字符串转换成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网站。在


Tags: 数据字符串文本字节格式记录数字int
1条回答
网友
1楼 · 发布于 2024-03-29 07:36:30

赤道是十六进制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。在

相关问题 更多 >