【问题标题】:Writing hex data into a file将十六进制数据写入文件
【发布时间】:2015-01-03 23:32:15
【问题描述】:

我正在尝试将取自 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 这是错误的!

问题出在哪里?

【问题讨论】:

    标签: python string file binary hex


    【解决方案1】:

    使用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()))
            )
    

    【讨论】:

      【解决方案2】:

      替换:

          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,))替换。

      【讨论】:

      • 这在 Python 3.x 中不起作用,因为二进制文件写入期望 bytesbytearray 对象,但 chr 返回一个 str 对象。
      • @falsetru 谢谢。答案现在更新为 py2 和 py3 形式。
      猜你喜欢
      • 2014-03-16
      • 2016-04-14
      • 2015-08-22
      • 2013-07-11
      • 2011-12-22
      • 1970-01-01
      • 2013-01-07
      • 2021-10-27
      • 2018-06-18
      相关资源
      最近更新 更多