Python - decode('hex')

Ganesh Pal ganesh1pal at gmail.com
Mon Feb 20 12:55:21 EST 2017


Hello Python world,

I  am on Linux and Python 2.7 ,  I need some help to figure out what is
going  wrong in the below piece of code

I am trying to replace seven bytes in the hexdumfile at a given offset


Program 1 works fine

#!/usr/bin/python
from qa.utils.easy_popen import run
import pdb

def replace_hex(fname, offset, newdata):
    #pdb.set_trace()
    with open(fname, 'r+b') as f:
        #Show current contents
        f.seek(offset)
        stringdata = f.read(len(newdata))
        print 'Current data:'
        print '%08X: %s\n' % (offset, stringdata.encode('hex'))

        #Replace data at offset with newdata
        f.seek(offset)
        f.write(newdata)
        f.close()
        #print the data
        cmd = 'hexdump -C %s' % (fname)
        print cmd
        out, err, ret = run(cmd)
        print "Hexdump file data for corrupting"
        print out, err, ret
        return fname

fname = '/tmp/2017-02-20_08-42-22/file1.raw'
offset = 0x1
newdata = '64000101057804'.decode('hex')

replace_hex(fname, offset, newdata)


-200-1# python file_2.py
Current data:
00000001: 6400010105789a

hexdump -C /tmp/2017-02-20_08-42-22/file1.raw
Hexdump file data for corrupting
00000000  06 64 00 01 01 05 78 04  73 1c ab 58 08 f9 8b 3b
 |.d....x.s..X...;|  ==> Replaced
00000010  1e 00 a1 00 01 00 00 00  64 00 01 01 05 78 02 00
 |........d....x..|




Program 2 ( Doesn't work , some junk character got replaced )


g-200-1# vi file_2.py
#!/usr/bin/python
from qa.utils.easy_popen import run
import pdb

def replace_hex(fname, offset, newdata):
    #pdb.set_trace()
    with open(fname, 'r+b') as f:
        #Show current contents
        f.seek(offset)
        stringdata = f.read(len(newdata))
        print 'Current data:'
        print '%08X: %s\n' % (offset, stringdata.encode('hex'))

        #Replace data at offset with newdata
        f.seek(offset)
        f.write(newdata)
        f.close()
        #print the data
        cmd = 'hexdump -C %s' % (fname)
        print cmd
        out, err, ret = run(cmd)
        print "Hexdump file data for corrupting"
        print out, err, ret
        return fname

fname = '/tmp/2017-02-20_08-42-22/file1.raw'
offset = 0x10
newdata = ""
newdata = '64000101057804'
newdata.decode('hex')
replace_hex(fname, offset, newdata)



g-200-1# python file_2.py
Current data:
00000010: 1e00a10001000000640001010578

hexdump -C /tmp/2017-02-20_08-42-22/MOB_file1.raw
Hexdump file data for corrupting
00000000  06 64 00 01 01 05 78 04  73 1c ab 58 08 f9 8b 3b
 |.d....x.s..X...;|
00000010  36 34 30 30 30 31 30 31  30 35 37 38 30 34 02 00
 |64000101057804..|===> Some junk values got writen ???
00000020  e0 00 00 00 00 00 00 00  00 00 00 00 01 00 00 00
 |................|
00000030  00 03 10 21 bf cd 05 80  00 00 00 00 00 00 00 00
 |...!............|
00000040  58 02 00 00 00 00 00 00  00 20 00 00 00 00 00 00  |X........
......|
00000050  01 00 00 00 00 00 00 00  03 00 00 00 00 00 00 00
 |................|
00000060  00 00 00 00 00 00 00 00  74 1c ab 58 a0 84 2b 00
 |........t..X..+.|
00000070  74 1c ab 58 a0 84 2b 00  fd ff fd ff 00 00 00 00
 |t..X..+.........|
00000080  02 04 25 40 04 00 01 64  00 01 01 05 78 04 31 30
 |..%@...d....x.10|
00000090  35 37 38 00 02 84 02 64  00 01 01 05 78 30 30 30
 |578....d....x000|
000000a0  31 30 30 30 32 00 0f fe  94 ba 15 00 00 00 00 00
 |10002...........|
000000b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
 |................|
*
000001d0  00 00 00 00 00 22 ff ff  ff ff 20 03 00 00 00 00  |....."....
.....|
000001e0  00 00 00 0b 04 00 0b 01  00 02 01 0a 00 01 00 64
 |...............d|
000001f0  06 00 00 01 00 02 97 0a  33 9b 3f 32 f3 62 b1 15
 |........3.?2.b..|





Questions:

1. The only difference between both the programs  the difference are just
the below lines.

newdata = '64000101057804'.decode('hex')

        and

newdata = ""
newdata = '64000101057804'
newdata.decode('hex')


What is happening here and how do I fix this in  program 2  ?   for my eyes
there doesn't look any difference .


question 2:

I am using  the variable  newdata  because  I can't hardcore the  value , I
have to  keep changing this every time the function is called,  will return
it as a string help me slove this problem

def get_data() :
      return str(data)

new_data =get_data(input)


Regards,
Ganesh



More information about the Python-list mailing list