Hex to Bin: Odd-length string error with binascii.unhexlify

2.3k views Asked by At

I want to convert a Hex file like this file in the bottom to Binary, but I give this error: I think I need to use .strip() method but I'm not very sure!

Traceback (most recent call last):
  File ".\descrypt.py", line 27, in <module>
    main()
  File ".\descrypt.py", line 23, in main
    HexDataBin = HexToBin(HexDataOutput.strip())
  File ".\descrypt.py", line 11, in HexToBin
    binary_string = binascii.unhexlify(HexString)
binascii.Error: Odd-length string

This is the Hex File:

01,00,00,00,d0,8c,9d,df,01,15,d1,11,8c,7a,00,c0,4f,c2,97,eb,\
01,00,00,00,d7,ab,17,ea,1a,93,80,48,90,e5,9c,7a,88,e1,69,cb,00,00,00,00,02,\
00,00,00,00,00,10,66,00,00,00,01,00,00,20,00,00,00,7e,b2,44,64,25,d4,22,21,\
1c,a1,c9,5a,fb,57,10,8a,50,a8,e1,2d,62,cb,e8,63,68,82,09,7c,98,e7,46,9e,00,\
00,00,00,0e,80,00,00,00,02,00,00,20,00,00,00,20,1c,7c,05,05,d9,9f,cd,1e,5b,\
c7,d3,8d,5e,41,14,82,3a,2b,04,7e,05,09,bb,2f,af,d8,93,fb,98,08,bc,20,00,00,\
00,7a,3e,d5,63,9e,de,99,76,2f,ff,cf,16,a7,c1,56,6f,27,ab,59,fd,f9,5b,e7,1a,\
5e,e9,f8,71,b4,d0,27,28,40,00,00,00,75,71,18,79,6d,72,39,a2,ed,42,4e,1a,f8,\
41,99,a5,9b,55,75,bb,89,d8,99,0f,72,af,49,f2,74,68,8d,11,ad,17,08,6b,8b,61,\
81,81,f7,fd,c8,95,41,cf,43,64,4c,21,94,ca,35,69,0a,56,9f,37,6a,3d,18,12,8f,\
e3

This is my code:

import binascii

def ReplaceHex(HexString, toReplace, newString):
   for elem in toReplace:
      if elem in HexString:
         HexString = HexString.replace(elem, newString)

return HexString

def HexToBin(HexString):
   binary_string = binascii.unhexlify(HexString)
   return HexString

def main():
   with open('target.txt', 'r') as HexFile:
      HexData = HexFile.read()

      print(HexData)

      HexDataOutput = ReplaceHex(HexData, [',', '\\'], " ")
      print(HexDataOutput)

      HexDataBin = HexToBin(HexDataOutput.strip())
      print(HexDataBin)

if __name__ == '__main__':
   main()
1

There are 1 answers

4
Stanislav Ivanov On BEST ANSWER

You need to filter space symbol also:

import binascii
from functools import reduce

with open('target.txt', 'r') as text:
    repls = [',','\\','\n',' ']
    # remove all symbols form repls in file content
    hexline = reduce(lambda a, v: a.replace(v,''), repls, text.read())
    binaryline = binascii.unhexlify(hexline) 
    print(binaryline)