Writing hex data into a file

67,872

Solution 1

Use 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()))
        )

Solution 2

replace:

    f.write(hex(i))

With:

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

Or,

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

Explanation

Observe:

>>> hex(65)
'0x41'

65 should translate into a single byte but hex returns a four character string. write will send all four characters to the file.

By contrast, in python2:

>>> chr(65)
'A'

This does what you want: chr converts the number 65 to the character single-byte string which is what belongs in a binary file.

In python3, chr(i) is replaced by bytes((i,)).

Share:
67,872
Pythonizer
Author by

Pythonizer

Updated on July 09, 2022

Comments

  • Pythonizer
    Pythonizer almost 2 years

    I'm trying to write hex data taken from ascii file to a newly created binary file

    ascii file example:

    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
    

    my code

    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))
    

    Thought hexList holds already hex converted data and f.write(hex(i)) should write these hex data into a file, but python writes it with ascii mode

    final output: 0x9f0x2c0x380x590xcd0x110x7c0x590xc90x30xea0x37 which is wrong!

    where is the issue?