By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,235 Members | 1,008 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 440,235 IT Pros & Developers. It's quick & easy.

binascii.unhexlify ... not clear about usage, and output

P: n/a
Hi,

I have a file with a long list of hex characters, and I want to get a
file with corresponding binary characters

here's what I did:
>>import binascii
f1 = 'c:\\temp\\allhex.txt'
f2 = 'c:\\temp\\allbin.txt'
sf = open(f1, 'rU')
df = open(f2, 'w')
slines = sf.readlines()
for line in slines:
.... x = line.rstrip('\n')
.... y = binascii.unhexlify(x)
.... df.write(y)
....
>>df.close()
sf.close()
But what I get is all garbage, atleast textpad and notepad show that
I tried doing it for only one string, and this is what I am seeing on
the interpreter:
>>x
'0164'
>>y
'\x01d'

I was expecting 'y' would come out as a string with binary
characters!!!

What am i missing here? Can someone please help.

Thanks and best regards,
Vishal

May 30 '07 #1
Share this Question
Share on Google+
6 Replies


P: n/a
Vishal wrote:
I have a file with a long list of hex characters, and I want to get a
file with corresponding binary characters

here's what I did:
>>>import binascii
f1 = 'c:\\temp\\allhex.txt'
f2 = 'c:\\temp\\allbin.txt'
sf = open(f1, 'rU')
df = open(f2, 'w')
slines = sf.readlines()
for line in slines:
... x = line.rstrip('\n')
... y = binascii.unhexlify(x)
... df.write(y)
...
>>>df.close()
sf.close()
Your code is OK, but you have to open f2 in binary mode if your data is
truly binary (an image, say).
But what I get is all garbage, atleast textpad and notepad show that
I tried doing it for only one string, and this is what I am seeing on
the interpreter:
>>>x
'0164'
>>>y
'\x01d'

I was expecting 'y' would come out as a string with binary
characters!!!
What are "binary characters"?
What am i missing here? Can someone please help.
What /exactly/ did you expect? Note that "\x01d" and "\x01\x64" are just
different renderings of the same string chr(0x01) + chr(0x64).

Peter

May 30 '07 #2

P: n/a
On May 30, 1:31 pm, Peter Otten <__pete...@web.dewrote:
Vishal wrote:
I have a file with a long list of hex characters, and I want to get a
file with corresponding binary characters
here's what I did:
>>import binascii
f1 = 'c:\\temp\\allhex.txt'
f2 = 'c:\\temp\\allbin.txt'
sf = open(f1, 'rU')
df = open(f2, 'w')
slines = sf.readlines()
for line in slines:
... x = line.rstrip('\n')
... y = binascii.unhexlify(x)
... df.write(y)
...
>>df.close()
sf.close()

Your code is OK, but you have to open f2 in binary mode if your data is
truly binary (an image, say).
But what I get is all garbage, atleast textpad and notepad show that
I tried doing it for only one string, and this is what I am seeing on
the interpreter:
>>x
'0164'
>>y
'\x01d'
I was expecting 'y' would come out as a string with binary
characters!!!

What are "binary characters"?
What am i missing here? Can someone please help.

What /exactly/ did you expect? Note that "\x01d" and "\x01\x64" are just
different renderings of the same string chr(0x01) + chr(0x64).

Peter
Thanks Peter for the explanation. Actually what I want is:

if Input is 0x0164, Output should be: 0000000101100100
where each nibble is separated and the output appears in terms of '0's
and '1's.

Can I do that with this function binascii.unhexlify()???

Thanks and best regards,
Vishal

Jul 11 '07 #3

P: n/a
On Jul 11, 3:21 am, Vishal <vsapr...@gmail.comwrote:
On May 30, 1:31 pm, Peter Otten <__pete...@web.dewrote:


Vishal wrote:
I have a file with a long list of hex characters, and I want to get a
file with corresponding binary characters
here's what I did:
>>>import binascii
>>>f1 = 'c:\\temp\\allhex.txt'
>>>f2 = 'c:\\temp\\allbin.txt'
>>>sf = open(f1, 'rU')
>>>df = open(f2, 'w')
>>>slines = sf.readlines()
>>>for line in slines:
... x = line.rstrip('\n')
... y = binascii.unhexlify(x)
... df.write(y)
...
>>>df.close()
>>>sf.close()
Your code is OK, but you have to open f2 in binary mode if your data is
truly binary (an image, say).
But what I get is all garbage, atleast textpad and notepad show that
I tried doing it for only one string, and this is what I am seeing on
the interpreter:
>>>x
'0164'
>>>y
'\x01d'
I was expecting 'y' would come out as a string with binary
characters!!!
What are "binary characters"?
What am i missing here? Can someone please help.
What /exactly/ did you expect? Note that "\x01d" and "\x01\x64" are just
different renderings of the same string chr(0x01) + chr(0x64).
Peter

Thanks Peter for the explanation. Actually what I want is:

if Input is 0x0164, Output should be: 0000000101100100
where each nibble is separated and the output appears in terms of '0's
and '1's.

Can I do that with this function binascii.unhexlify()???
You can with gmpy:
>>import gmpy
x = 0x0164
s = gmpy.digits(x,2) # convert to base 2
y = '0'*(16-len(s)) + s # pad to 16 bits
y
'0000000101100100'

>
Thanks and best regards,
Vishal
Jul 11 '07 #4

P: n/a
On Wed, 11 Jul 2007 10:46:23 -0700, me********@aol.com wrote:
You can with gmpy:
>>>import gmpy
x = 0x0164
s = gmpy.digits(x,2) # convert to base 2
y = '0'*(16-len(s)) + s # pad to 16 bits
y
'0000000101100100'
For the padding I'd use the `zfill()` method.

In [15]: a = 0x0164

In [16]: gmpy.digits(a, 2).zfill(16)
Out[16]: '0000000101100100'

Ciao,
Marc 'BlackJack' Rintsch
Jul 11 '07 #5

P: n/a
On Jul 11, 1:38 pm, Marc 'BlackJack' Rintsch <bj_...@gmx.netwrote:
On Wed, 11 Jul 2007 10:46:23 -0700, mensana...@aol.com wrote:
You can with gmpy:
>>import gmpy
x = 0x0164
s = gmpy.digits(x,2) # convert to base 2
y = '0'*(16-len(s)) + s # pad to 16 bits
y
'0000000101100100'

For the padding I'd use the `zfill()` method.

In [15]: a = 0x0164

In [16]: gmpy.digits(a, 2).zfill(16)
Out[16]: '0000000101100100'

Ciao,
Marc 'BlackJack' Rintsch
Damn, I didn't know you could do that.
If only there was a built-in base 2 conversion.

Jul 11 '07 #6

P: n/a
En Wed, 11 Jul 2007 17:34:04 -0300, me********@aol.com
<me********@aol.comescribió:
If only there was a built-in base 2 conversion.
No builtin, but you can find uncountable versions if you search this
group, or the Python cookbook, or the entire web...

--
Gabriel Genellina

Jul 12 '07 #7

This discussion thread is closed

Replies have been disabled for this discussion.