13

In python, how to convert a hex ASCII string to binary string?

Example:

01000001B8000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435362021222324

Needs to be converted to a binary string. (0A need to be converted to 1010, not to ASCII bit 1000001 which is 65)

edit : Changed "raw binary" in question to "raw internal binary" string for better clarity.

newfurniturey
  • 37,556
  • 9
  • 94
  • 102
Lunar Mushrooms
  • 8,358
  • 18
  • 66
  • 88

5 Answers5

17
import base64
data = base64.b16decode("01000001B8000102030405")
fulmicoton
  • 15,502
  • 9
  • 54
  • 74
9

Is this what you're searching for?

hex_string = '0A'
'{0:b}'.format(int(hex_string, 16))
# returns '1010'

or

''.join('{0:04b}'.format(int(c, 16)) for c in hex_string)
eumiro
  • 207,213
  • 34
  • 299
  • 261
  • thanks. But my string is very long. It wont fit in an integer. The converted binary shall go to some kind of continuous memory structures like array or so. – Lunar Mushrooms Dec 09 '11 at 12:32
  • @LunarMushrooms - this works with your example string too. But I have added a special version for you… – eumiro Dec 09 '11 at 12:34
  • 2
    Did you even try this on your string? It works great (`int`s can have any size): `'100000000000000000000000110111000000000000000000100000010000000110000010000000101000001100000011100001000000010010000101000001011000011000000110100001110000011110001000000010001000100100001001100010100000101010001011000010111000110000001100100011010000110110001110000011101000111100001111100100000001000010010001000100011001001000010010100100110001001110010100000101001001010100010101100101100001011010010111000101111001100000011000100110010001100110011010000110101001101100010000000100001001000100010001100100100'` – Tim Pietzcker Dec 09 '11 at 12:34
  • Thanks. But it is converting again to ascii string "1010" . As suggested in another answer , base64.b16decode worked for me – Lunar Mushrooms Dec 09 '11 at 12:46
8

You probably need the .decode('hex') method of strings (Python 2.x).

data= ("01000001B8000102030405060708090A0B0C0D0E0F10111213141516"
    "1718191A1B1C1D1E1F202122232425262728292A2B"
    "2C2D2E2F303132333435362021222324")
data.decode('hex')

Otherwise, you can use base64.b16decode, but you might want to supply a True to the second parameter (casefold) if your input contains lowercase hex digits A to F.

tzot
  • 92,761
  • 29
  • 141
  • 204
4

I'm not quite sure what you mean by a "binary string". If you mean a string storing the binary data you can use the binascii module.

>>> data = "01000001B8000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435362021222324"
>>> import binascii
>>> binary = binascii.a2b_hex(data)
>>> binary
'\x01\x00\x00\x01\xb8\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./0123456 !"#$'

However, if you really want a string containing lots of "0"s and "1"s you need to go one stage further:

>>> "".join("{:08b}".format(ord(i)) for i in binary)
'0000000100000000000000000000000110111000000000000000000100000010000000110000010000000101000001100000011100001000000010010000101000001011000011000000110100001110000011110001000000010001000100100001001100010100000101010001011000010111000110000001100100011010000110110001110000011101000111100001111100100000001000010010001000100011001001000010010100100110001001110010100000101001001010100010101100101100001011010010111000101111001100000011000100110010001100110011010000110101001101100010000000100001001000100010001100100100'
David Webb
  • 190,537
  • 57
  • 313
  • 299
1

An easy way to do what you're trying to do... convert your string to a hex decimal then use the built in bin function to convert it to binary.

dec_string = int(your_string, 16) #cast as int

bin_string = bin(dec_string) #convert to binary
Larry E
  • 19
  • 3