Reading binary with header

Miki Tebeka miki.tebeka at zoran.com
Tue Jul 26 02:38:34 EDT 2005


Hello Dan,

>    I am trying to head in a binary file that has a header and different
>    character types. The array module apparently expects the typecode to
>    be the same throughout. Here's what the file looks like:
> 
>    Byte number:    type:   value:  purpose:
>    1-4             char    "ver."
>    5-8             char    "0001" version number
>    9-12            int     1, 2, 3, or 4 data type: 1=unsigned byte
>    2=unsigned short 3=32-bit integer 4=32-bit floating point
> 
>    13-16           int             x dimension, xdim
>    7-20            int             y dimension, ydim
>    20-24           int             z dimension, zdim
>    25-28           int             xdim*ydim*zdim
> 
>    The rest of the file contains the data array of type in indicated in
>    bytes 9-12.
> 
>    I have tried:
>    import Numeric as N
>    import array
>    fileobj = open(myfile, mode='rb')
>    s = array.array('f')
>    s.read(fileobj, size)
>    data = N.array(s, typecode=N.Int)
>    fileobj.close()
> 
>    But the header must confuse things because I do get what I expect.
I'd use the struct module to read the header and then create an array
according to type.
Note: The code below is untested and without error checking.

    from struct import struct
    from array import array
    from os.path import getsize

    TYPES = { # Type of array
        1 : "c",
        2 : "H",
        3 : "i",
        4 : "f"
    }

    filesize = getsize(filename) # File size
    fo = open(filename, "rb")
    header = fo.read(12) # Read interesting header information
    fields = unpack("ssssssssi", header)
    fo.read(15) # Skip non-data header

    a = array(TYPES[fields[-1]) # Create array
    size = (filesize - 28) / a.itemsize # Size to read
    a.read(fo, size) # Read to array


Also check that you don't have little/big endien problems.

HTH.
--
------------------------------------------------------------------------
Miki Tebeka <miki.tebeka at zoran.com>
http://tebeka.bizhat.com
The only difference between children and adults is the price of the toys
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 193 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/python-list/attachments/20050726/a76bd721/attachment.sig>


More information about the Python-list mailing list