Python - 十六进制字节读取问题
Python - issue with reading in hex byte
我正在读取一个包含十六进制字节的文件,我相信这是我写的:
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' 的十六进制是这样的:
480065006C006C006F00200077006F0072006C00640021
如果仔细观察,'48' 与 hex_list 中的前两个元素匹配,除了零在路上,字母 e 的十六进制值为 65...
文件中的字节是否有错误?还是我读错了字节?
谢谢
文件可以在这里下载:
https://drive.google.com/file/d/0B84_Z1V4nj9SS0x4MlR0a2poMkE/view?usp=sharing
十六进制文件内容:
$ 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
:
填充
H
是 04 80
而不是 48
e
是 65
(正确)
l
是 06 c0
而不是 6c
l
是 6c
(正确)
o
是 06 f0
而不是 6f
,
是 2c
(正确)
</code> (space) 是 <code>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!
我正在读取一个包含十六进制字节的文件,我相信这是我写的:
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' 的十六进制是这样的:
480065006C006C006F00200077006F0072006C00640021
如果仔细观察,'48' 与 hex_list 中的前两个元素匹配,除了零在路上,字母 e 的十六进制值为 65...
文件中的字节是否有错误?还是我读错了字节?
谢谢
文件可以在这里下载: https://drive.google.com/file/d/0B84_Z1V4nj9SS0x4MlR0a2poMkE/view?usp=sharing
十六进制文件内容:
$ 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
:
H
是04 80
而不是48
e
是65
(正确)l
是06 c0
而不是6c
l
是6c
(正确)o
是06 f0
而不是6f
,
是2c
(正确)</code> (space) 是 <code>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!