19

How do I write a string of bytes to a file, in byte mode, using python?

I have:

['0x28', '0x0', '0x0', '0x0']

How do I write 0x28, 0x0, 0x0, 0x0 to a file? I don't know how to transform this string to a valid byte and write it.

2 Answers 2

23

Map to a bytearray() or bytes() object, then write that to the file:

with open(outputfilename, 'wb') as output:
    output.write(bytearray(int(i, 16) for i in yoursequence))

Another option is to use the binascii.unhexlify() function to turn your hex strings into a bytes value:

from binascii import unhexlify

with open(outputfilename, 'wb') as output:
    output.write(unhexlify(''.join(format(i[2:], '>02s') for i in b)))

Here we have to chop off the 0x part first, then reformat the value to pad it with zeros and join the whole into one string.

Sign up to request clarification or add additional context in comments.

Comments

11

In Python 3.X, bytes() will turn an integer sequence into a bytes sequence:

>>> bytes([1,65,2,255])
b'\x01A\x02\xff'

A generator expression can be used to convert your sequence into integers (note that int(x,0) converts a string to an integer according to its prefix. 0x selects hex):

>>> list(int(x,0) for x in ['0x28','0x0','0x0','0x0'])
[40, 0, 0, 0]

Combining them:

>>> bytes(int(x,0) for x in ['0x28','0x0','0x0','0x0'])
b'(\x00\x00\x00'

And writing them out:

>>> L = ['0x28','0x0','0x0','0x0']
>>> with open('out.dat','wb') as f:
...  f.write(bytes(int(x,0) for x in L))
...
4

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.