Python的十六进制读取问题

2024-10-03 13:31:18 发布

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

我正在读一个包含十六进制字节的文件,我相信,下面是我写的:

def ByteToHexToDec( byteStr ):
    hex_list = [ "%02X" % ord(x) if "\\x" in r"%r" % x else x for x in byteStr];
    return hex_list;

with open("file.z","rb") as lines:
    for line in lines:
        print ByteToHexToDec(line);

下面是它返回的结果:

['04', '80', 'e', '06', 'C0', 'l', '06', 'F0', ',', '02', '00', 'w', '06', 'F0', 'r', '06', 'C0', 'd', '02', '10', '\n']

我很确定这是在说hello world(或者类似的东西),我知道“hello world”的十六进制是这样的:

480065006C006C006F00200077006F0072006C00640021

如果你仔细看,“48”与十六进制列表中的前两个元素匹配,除了零在路上,字母e有十六进制值65。。。你知道吗

那么文件中的字节有什么错误吗?还是我读错了字节?你知道吗

谢谢

文件可在此处下载: https://drive.google.com/file/d/0B84_Z1V4nj9SS0x4MlR0a2poMkE/view?usp=sharing


Tags: 文件inhelloforworld字节linelist
2条回答

以十六进制表示的文件内容:

$ od -t x1z -w16 file.z 
0000000 04 80 65 06 c0 6c 06 f0 2c 02 00 77 06 f0 72 06  >..e..l..,..w..r.<
0000020 c0 64 02 10 0a                                   >.d...<
0000025

你在尝试什么?你知道吗

$ echo 'hello world' | od -t x1z -w12 
0000000 68 65 6c 6c 6f 20 77 6f 72 6c 64 0a  >hello world.<
0000014

注意binascii模块中的hexlify/unhexlify https://docs.python.org/2/library/binascii.html

文件中的每一个字节都用一个开始和结尾的0填充:

  • H04 80而不是48
  • e65(正确)
  • l06 c0而不是6c
  • l6c(正确)
  • o06 f0而不是6f
  • ,2c(正确)
  • (space) is 02 00而不是20

等等

如果你想把它变回Hello, world,你必须修复破损处:

def repairbroken(bytestr):
    bytestr = iter(bytestr)
    for byte1, byte2, byte3 in zip(*([bytestr] * 3)):
        # character 1 is bits 4-7 in the first byte and bits 0-3 in the second
        char1 = chr((ord(byte1) & 0xff) << 4 | (ord(byte2) & 0xff) >> 4)
        yield char1
        yield byte3

演示:

>>> binary = '\x04\x80e\x06\xc0l\x06\xf0,\x02\x00w\x06\xf0r\x06\xc0d\x02\x10\n'
>>> print ''.join(repairbroken(binary))
Hello, world!

相关问题 更多 >