4.4 The xdrlib Module
The xdrlib module converts between Python datatypes and Sun's external data
representation (XDR), as Example 4-7 illustrates.
Example 4-7. Using the xdrlib Module
File: xdrlib-example-1.py
import xdrlib
#
# create a packer and add some data to it
p = xdrlib.Packer()
p.pack_uint(1)
p.pack_string("spam")
data = p.get_buffer()
print "packed:", repr(data)
#
# create an unpacker and use it to decode the data
u = xdrlib.Unpacker(data)
print "unpacked:", u.unpack_uint(), repr(u.unpack_string())
u.done()
packed: '\000\000\000\001\000\000\000\004spam'
unpacked: 1 'spam'
The XDR format is used by Sun's remote procedure call (RPC) protocol.
Example 4-8 is an incomplete (and rather contrived) example showing how to
build an RPC request package.
Example 4-8. Using the xdrlib Module to Send an RPC Call Package
File: xdrlib-example-2.py
import xdrlib
# some constants (see the RPC specs for details)
RPC_CALL = 1
RPC_VERSION = 2
MY_PROGRAM_ID = 1234 # assigned by Sun
MY_VERSION_ID = 1000
MY_TIME_PROCEDURE_ID = 9999
AUTH_NULL = 0
transaction = 1
p = xdrlib.Packer()
# send a Sun RPC call package
p.pack_uint(transaction)
p.pack_enum(RPC_CALL)
p.pack_uint(RPC_VERSION)
p.pack_uint(MY_PROGRAM_ID)
p.pack_uint(MY_VERSION_ID)
p.pack_uint(MY_TIME_PROCEDURE_ID)
p.pack_enum(AUTH_NULL)
p.pack_uint(0)
p.pack_enum(AUTH_NULL)
p.pack_uint(0)
print repr(p.get_buffer())
'\000\000\000\001\000\000\000\001\000\000\000\002\000\000\004\322
\000\000\003\350\000\000\'\017\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000'
|