"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