Reading a binary file

Steven Taschuk staschuk at telusplanet.net
Thu Jun 26 14:50:15 CEST 2003


Quoth Sorin Marti:
  [...]
> That is not exactly what I meant. I've found a solution (a is the binary 
> data):
> 
> b = binascii.hexlify(a)
> 
> For example it gives me C8 which is a HEX-Value. How to change this one 
> into a decimal? (The decimal should be 130, right?)

200, actually; hex C = 12, so hex C8 = 12*16 + 8 = 200.

Each byte represents a number in the range [0..255].  Those
numbers may be obtained with the ord function, as Andrew noted:

    >>> bytes = file('foo.py', 'rb').read(10)
    >>> bytes
    'def inplac'
    >>> map(ord, bytes)
    [100, 101, 102, 32, 105, 110, 112, 108, 97, 99]

These are numbers, so you can, e.g., do arithmetic with them.
They are neither hex numbers nor decimal numbers; 'hex' and
'decimal' describe notations by which numbers may be represented,
not numbers themselves.  So, when you ask for the hex value, it
seems you want a string containing characters which represent the
number in hexadecimal notation.  The hex function does that, again
as Andrew noted:

    >>> numbers = map(ord, bytes)
    >>> [hex(num)[2:] for num in numbers]
    ['64', '65', '66', '20', '69', '6e', '70', '6c', '61', '63']

(I've cut out the leading '0x' which this function produces.)  As
you've discovered, binascii.hexlify does this all in one step --
turns a string containing bytes into a string containing
hexadecimal digits representing the bytes:

    >>> import binascii
    >>> binascii.hexlify(bytes)
    '64656620696e706c6163'

If, for some reason, you wanted to obtain numbers from such a
string, you could do it this way, for example:

    >>> def hex2numbers(s):
    ...     numbers = []
    ...     for i in range(0, len(s), 2):
    ...         numbers.append(int(s[i:i+2], 16))
    ...     return numbers
    ... 
    >>> hex2numbers(binascii.hexlify(bytes))
    [100, 101, 102, 32, 105, 110, 112, 108, 97, 99]

-- 
Steven Taschuk                staschuk at telusplanet.net
"I tried to be pleasant and accommodating, but my head
 began to hurt from his banality."   -- _Seven_ (1996)





More information about the Python-list mailing list