Reading binary data

Jon Clements joncle at googlemail.com
Wed Sep 10 13:41:19 EDT 2008


On 10 Sep, 18:33, Jon Clements <jon... at googlemail.com> wrote:
> On 10 Sep, 18:14, Aaron Scott <aaron.hildebra... at gmail.com> wrote:
>
>
>
> > I've been trying to tackle this all morning, and so far I've been
> > completely unsuccessful. I have a binary file that I have the
> > structure to, and I'd like to read it into Python. It's not a
> > particularly complicated file. For instance:
>
> > signature   char[3]     "GDE"
> > version     uint32      2
> > attr_count  uint32
> > {
> >     attr_id         uint32
> >     attr_val_len    uint32
> >     attr_val        char[attr_val_len]
>
> > } ... repeated attr_count times ...
>
> > However, I can't find a way to bring it into Python. This is my code
> > -- which I know is definitely wrong, but I had to start somewhere:
>
> > import struct
> > file = open("test.gde", "rb")
> > output = file.read(3)
> > print output
> > version = struct.unpack("I", file.read(4))[0]
> > print version
> > attr_count = struct.unpack("I", file.read(4))[0]
> > while attr_count:
> >         print "---"
> >         file.seek(4, 1)
> >         counter = int(struct.unpack("I", file.read(4))[0])
> >         print file.read(counter)
> >         attr_count -= 1
> > file.close()
>
> > Of course, this doesn't work at all. It produces:
>
> > GDE
> > 2
> > ---
> > é
> > ---
> > ê Å
>
> > I'm completely at a loss. If anyone could show me the correct way to
> > do this (or at least point me in the right direction), I'd be
> > extremely grateful.
>
> What if we view the data as having an 11 byte header:
> signature, version, attr_count = struct.unpack('3cII',
> yourfile.read(11))
>
> Then for the list of attr's:
> for idx in xrange(attr_count):
>     attr_id, attr_val_len = struct.unpack('II', yourfile.read(8))
>     attr_val = yourfile.read(attr_val_len)
>
> hth, or gives you a pointer anyway
> Jon.

CORRECTION: '3cII' should be '3sII'.




More information about the Python-list mailing list