问题 将十六进制数据写入文件


我正在尝试将从ascii文件中获取的十六进制数据写入新创建的二进制文件

ascii文件示例:

98 af b7 93 bb 03 bf 8e ae 16 bf 2e 52 43 8b df
4f 4e 5a e4 26 3f ca f7 b1 ab 93 4f 20 bf 0a bf
82 2c dd c5 38 70 17 a0 00 fd 3b fe 3d 53 fc 3b
28 c1 ff 9e a9 28 29 c1 94 d4 54 d4 d4 ff 7b 40

我的代码

hexList = []
with open('hexFile.txt', 'r') as hexData:
    line=hexData.readline()
    while line != '':
        line = line.rstrip()
        lineHex = line.split(' ')
        for i in lineHex:
            hexList.append(int(i, 16))
        line = hexData.readline()


with open('test', 'wb') as f:
    for i in hexList:
        f.write(hex(i))

思想 hexList 保存已经十六进制转换的数据 f.write(hex(i)) 应该将这些十六进制数据写入文件,但是python使用ascii模式编写它

最终输出: 0x9f0x2c0x380x590xcd0x110x7c0x590xc90x30xea0x37 这是错的!

问题在哪里?


13006
2017-11-07 08:07


起源



答案:


使用 binascii.unhexlify

>>> import binascii
>>> binascii.unhexlify('9f')
'\x9f'

>>> hex(int('9f', 16))
'0x9f'

import binascii

with open('hexFile.txt') as f, open('test', 'wb') as fout:
    for line in f:
        fout.write(
            binascii.unhexlify(''.join(line.split()))
        )

9
2017-11-07 08:12



比主代码工作得快得多 - Pythonizer


答案:


使用 binascii.unhexlify

>>> import binascii
>>> binascii.unhexlify('9f')
'\x9f'

>>> hex(int('9f', 16))
'0x9f'

import binascii

with open('hexFile.txt') as f, open('test', 'wb') as fout:
    for line in f:
        fout.write(
            binascii.unhexlify(''.join(line.split()))
        )

9
2017-11-07 08:12



比主代码工作得快得多 - Pythonizer


更换:

    f.write(hex(i))

附:

    f.write(chr(i))  # python 2

要么,

    f.write(bytes((i,))) # python 3

说明

注意:

>>> hex(65)
'0x41'

65 应该翻译成单个字节但是 hex 返回一个四字符串。 write 将所有四个字符发送到该文件。

相比之下,在python2中:

>>> chr(65)
'A'

这样做你想要的: chr 转换数字 65 字符串单字节字符串,属于二进制文件。

在python3中, chr(i) 被替换为 bytes((i,))


1
2017-11-07 08:18



这在Python 3.x中不起作用,因为期望二进制文件写入 bytes 要么 bytearray 对象,但是 chr 返回一个 str 目的。 - falsetru
@falsetru谢谢。现在使用py2和py3格式更新答案。 - John1024