"Bill Campbell" <b...@celestial.net> wrote

struct nameid {
       u32bits len /* total length */
u32bits id;
char name; /* name variable length */
}

I haven't done this in python yet, but when handling things like
this in C and perl, I have done it with two reads, the first to
get the length, the second to read the data with that length.

Ah yes, I didn't notice that len was the total length of the record,
in that case its much easier. As Bill says you can construct the
struct format string using the calculated length value. Something
like:

fmt = "%dc" % len - (2 * LEN32)
name = struct.unpack(fmt)

You can see a working example of something similar in my
tutor in the handling files topic in the binary files section:

In our case we know it must be like the one we created in formatAddress(), namely 'iNs' where N is a variable number. How do we determine the value of N?

The struct module provides some helper functions that return the size of each data type, so by firing up the Python prompt and experimenting we can find out how many bytes of data we will get back for each data type:

import struct
print struct.calcsize('i')
4
print struct.calcsize('s')
1
Ok, we know that our data will comprise 4 bytes for the number and one byte for each character. So N will be the length of the data minus 4. Let's try using that to read our file:

import struct
f = file('address.bin','rb')
data = f.read()
f.close()

fmtString = "i%ds" % (len(data) - 4)
number, rest = struct.unpack(fmtString, data)
address = ' '.join((str(number),rest))

print "Address after restoring data:", addressHTH,

--
Alan Gauld
Author of the Learn to Program web site
http://www.freenetpages.co.uk/hp/alan.gauld

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to