how to use xdrlib

Thomas Jollans thomas at jollybox.de
Sun Aug 22 06:41:55 EDT 2010


On Sunday 22 August 2010, it occurred to Alan Wilter Sousa da Silva to 
exclaim:
> Hi there,
> 
> I am trying to understand how xdrlib works as I want to read files in this
> format. The problem is I don't much about xdr (although I read
> http://docs.python.org/library/xdrlib.html and RFC 1832).
> 
> Another problem is I don't know how the file I want to read was encoded.
> 
> So when I do something like:
> 
> import xdrlib
> 
> f = open('file.xdr').read()
> data = xdrlib.Unpacker(f)
> 
> Then, I don't know which "unpack_*" to use.

If you actually have read RFC 1832, then this surprises me: as far as I can 
see, and I have only skimmed the RFC so I may be wrong, it includes no way to 
specify the type of a piece of data -- you have to know what you're reading.

> 
> If I use,
> 
> repr(data.unpack_string())
> 
> sometimes it returns something meaningful like:
> 
> "'Ryckaert-Bell.'"

This happens when the data was actually a string -- so you correctly used 
unpack_string

> 
> but other times,
> 
> '\x00\x00\x00\x04Bond\x00\x00\x00\x05Angle\x00\x00\x00\x00\x00\x00\x0bPrope
> r Dih.\x00'

Here, you read data that was not originally a string  as if it were one. 

What the xdrlib module did is: it read four bytes. Probably 00 00 00 24. And 
it interpreted these to be the length of the string you're trying to read. 
Actually, you probably should have read an int first.
After that, you could have called unpack_string, which would have read in
00 00 00 04 -- aha, a four-long string -- and then read another four bytes, 
the actual string: "Bond". Similarly, "Angle" has length 0x00000005, it's 
followed by padding unto 4-byte margins, followed by the length of "Proper 
Dih.", which happens to be 0x0000000b.

> 
> if not a error.

That might happen if the number xdrlib interprets as the string length is 
larger than the length of the rest of the file.

> 
> Well, as you see, I am a bit lost here and any hint would be very
> appreciated.

Basically, you have to know which file format you're dealing with, and use the 
right unpack functions in the correct order for the specific file you're 
dealing with. So you need some documentation for the file format you're using 
-- XDR (like Microsoft's StructuredStorage, or even XML) doesn't as of itself 
make any claims about the nature or structure of the data it holds.

Cheers,
 - Thomas



More information about the Python-list mailing list