21

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?

2 Answers 2

26

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()))
        )
Sign up to request clarification or add additional context in comments.

Comments

4

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

2 Comments

This will not work in Python 3.x, because binary file write expect bytes or bytearray object, but chr returns a str object.
@falsetru Thanks. The answer is now updated with both py2 and py3 forms.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.