我正在尝试将字符串/十六进制转换为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网站一样符合预期并进行转换。
答案 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。