blob: 6b44cb0e4404173903afa3653733a6ad333208ad [file] [log] [blame]
Guido van Rossum40006cf1996-08-19 22:58:03 +00001\section{Standard module \sectcode{xdrlib}}
2\stmodindex{xdrlib}
3\index{XDR}
4
5\renewcommand{\indexsubitem}{(in module xdrlib)}
6
7
8The \code{xdrlib} module supports the External Data Representation
9Standard as described in RFC 1014, written by Sun Microsystems,
10Inc. June 1987. It supports most of the data types described in the
11RFC, although some, most notably \code{float} and \code{double} are
12only supported on those operating systems that provide an XDR
13library.
14
15The \code{xdrlib} module defines two classes, one for packing
16variables into XDR representation, and another for unpacking from XDR
17representation. There are also two exception classes.
18
19
20\subsection{Packer Objects}
21
22\code{Packer} is the class for packing data into XDR representation.
23The \code{Packer} class is instantiated with no arguments.
24
25\begin{funcdesc}{get_buffer}{}
26Returns the current pack buffer as a string.
27\end{funcdesc}
28
29\begin{funcdesc}{reset}{}
30Resets the pack buffer to the empty string.
31\end{funcdesc}
32
33In general, you can pack any of the most common XDR data types by
34calling the appropriate \code{pack_\var{type}} method. Each method
35takes a single argument, the value to pack. The following simple data
36type packing methods are supported: \code{pack_uint}, \code{pack_int},
37\code{pack_enum}, \code{pack_bool}, \code{pack_uhyper},
38and \code{pack_hyper}.
39
40The following methods pack floating point numbers, however they
41require C library support. Without the optional C built-in module,
42both of these methods will raise an \code{xdrlib.ConversionError}
43exception. See the note at the end of this chapter for details.
44
45\begin{funcdesc}{pack_float}{value}
46Packs the single-precision floating point number \var{value}.
47\end{funcdesc}
48
49\begin{funcdesc}{pack_double}{value}
50Packs the double-precision floating point number \var{value}.
51\end{funcdesc}
52
53The following methods support packing strings, bytes, and opaque data:
54
55\begin{funcdesc}{pack_fstring}{n\, s}
56Packs a fixed length string, \var{s}. \var{n} is the length of the
57string but it is \emph{not} packed into the data buffer. The string
58is padded with null bytes if necessary to guaranteed 4 byte alignment.
59\end{funcdesc}
60
61\begin{funcdesc}{pack_fopaque}{n\, data}
62Packs a fixed length opaque data stream, similarly to
63\code{pack_fstring}.
64\end{funcdesc}
65
66\begin{funcdesc}{pack_string}{s}
67Packs a variable length string, \var{s}. The length of the string is
68first packed as an unsigned integer, then the string data is packed
69with \code{pack_fstring}.
70\end{funcdesc}
71
72\begin{funcdesc}{pack_opaque}{data}
73Packs a variable length opaque data string, similarly to
74\code{pack_string}.
75\end{funcdesc}
76
77\begin{funcdesc}{pack_bytes}{bytes}
78Packs a variable length byte stream, similarly to \code{pack_string}.
79\end{funcdesc}
80
81The following methods support packing arrays and lists:
82
83\begin{funcdesc}{pack_list}{list\, pack_item}
84Packs a \var{list} of homogeneous items. This method is useful for
85lists with an indeterminate size; i.e. the size is not available until
86the entire list has been walked. For each item in the list, an
87unsigned integer \code{1} is packed first, followed by the data value
88from the list. \var{pack_item} is the function that is called to pack
89the individual item. At the end of the list, an unsigned integer
90\code{0} is packed.
91\end{funcdesc}
92
93\begin{funcdesc}{pack_farray}{n\, array\, pack_item}
94Packs a fixed length list (\var{array}) of homogeneous items. \var{n}
95is the length of the list; it is \emph{not} packed into the buffer,
96but a \code{ValueError} exception is raised if \code{len(array)} is not
97equal to \var{n}. As above, \var{pack_item} is the function used to
98pack each element.
99\end{funcdesc}
100
101\begin{funcdesc}{pack_array}{list\, pack_item}
102Packs a variable length \var{list} of homogeneous items. First, the
103length of the list is packed as an unsigned integer, then each element
104is packed as in \code{pack_farray} above.
105\end{funcdesc}
106
107\subsection{Unpacker Objects}
108
109\code{Unpacker} is the complementary class which unpacks XDR data
110values from a string buffer, and has the following methods:
111
112\begin{funcdesc}{__init__}{data}
113Instantiates an \code{Unpacker} object with the string buffer
114\var{data}.
115\end{funcdesc}
116
117\begin{funcdesc}{reset}{data}
118Resets the string buffer with the given \var{data}.
119\end{funcdesc}
120
121\begin{funcdesc}{get_position}{}
122Returns the current unpack position in the data buffer.
123\end{funcdesc}
124
125\begin{funcdesc}{set_position}{position}
126Sets the data buffer unpack position to \var{position}. You should be
127careful about using \code{get_position()} and \code{set_position()}.
128\end{funcdesc}
129
130\begin{funcdesc}{done}{}
131Indicates unpack completion. Raises an \code{xdrlib.Error} exception
132if all of the data has not been unpacked.
133\end{funcdesc}
134
135In addition, every data type that can be packed with a \code{Packer},
136can be unpacked with an \code{Unpacker}. Unpacking methods are of the
137form \code{unpack_\var{type}}, and take no arguments. They return the
138unpacked object. The same caveats apply for \code{unpack_float} and
139\code{unpack_double} as above.
140
Guido van Rossum3f247ad1996-09-27 17:11:24 +0000141\begin{funcdesc}{unpack_float}{}
142Unpacks a single-precision floating point number.
143\end{funcdesc}
144
145\begin{funcdesc}{unpack_double}{}
146Unpacks a double-precision floating point number, similarly to
147\code{unpack_float}.
148\end{funcdesc}
149
Guido van Rossum40006cf1996-08-19 22:58:03 +0000150In addition, the following methods unpack strings, bytes, and opaque
151data:
152
153\begin{funcdesc}{unpack_fstring}{n}
154Unpacks and returns a fixed length string. \var{n} is the number of
155characters expected. Padding with null bytes to guaranteed 4 byte
156alignment is assumed.
157\end{funcdesc}
158
159\begin{funcdesc}{unpack_fopaque}{n}
160Unpacks and returns a fixed length opaque data stream, similarly to
161\code{unpack_fstring}.
162\end{funcdesc}
163
Guido van Rossum3f247ad1996-09-27 17:11:24 +0000164\begin{funcdesc}{unpack_string}{}
Guido van Rossum40006cf1996-08-19 22:58:03 +0000165Unpacks and returns a variable length string. The length of the
166string is first unpacked as an unsigned integer, then the string data
167is unpacked with \code{unpack_fstring}.
168\end{funcdesc}
169
170\begin{funcdesc}{unpack_opaque}{}
171Unpacks and returns a variable length opaque data string, similarly to
Guido van Rossum3f247ad1996-09-27 17:11:24 +0000172\code{unpack_string}.
Guido van Rossum40006cf1996-08-19 22:58:03 +0000173\end{funcdesc}
174
175\begin{funcdesc}{unpack_bytes}{}
176Unpacks and returns a variable length byte stream, similarly to
Guido van Rossum3f247ad1996-09-27 17:11:24 +0000177\code{unpack_string}.
Guido van Rossum40006cf1996-08-19 22:58:03 +0000178\end{funcdesc}
179
180The following methods support unpacking arrays and lists:
181
182\begin{funcdesc}{unpack_list}{unpack_item}
183Unpacks and returns a list of homogeneous items. The list is unpacked
184one element at a time
185by first unpacking an unsigned integer flag. If the flag is \code{1},
186then the item is unpacked and appended to the list. A flag of
187\code{0} indicates the end of the list. \var{unpack_item} is the
188function that is called to unpack the items.
189\end{funcdesc}
190
191\begin{funcdesc}{unpack_farray}{n\, unpack_item}
192Unpacks and returns (as a list) a fixed length array of homogeneous
193items. \var{n} is number of list elements to expect in the buffer.
194As above, \var{unpack_item} is the function used to unpack each element.
195\end{funcdesc}
196
197\begin{funcdesc}{unpack_array}{unpack_item}
198Unpacks and returns a variable length \var{list} of homogeneous items.
199First, the length of the list is unpacked as an unsigned integer, then
200each element is unpacked as in \code{unpack_farray} above.
201\end{funcdesc}
202
203\subsection{Exceptions}
204
205Exceptions in this module are coded as class instances:
206
207\begin{excdesc}{Error}
208The base exception class. \code{Error} has a single public data
209member \code{msg} containing the description of the error.
210\end{excdesc}
211
212\begin{excdesc}{ConversionError}
213Class derived from \code{Error}. Contains no additional instance
214variables.
215\end{excdesc}
216
217Here is an example of how you would catch one of these exceptions:
218
219\begin{verbatim}
220import xdrlib
221p = xdrlib.Packer()
222try:
223 p.pack_double(8.01)
224except xdrlib.ConversionError, instance:
225 print 'packing the double failed:', instance.msg
226\end{verbatim}
227
228\subsection{Supporting Floating Point Data}
229
230Packing and unpacking floating point data,
231i.e. \code{Packer.pack_float}, \code{Packer.pack_double},
232\code{Unpacker.unpack_float}, and \code{Unpacker.unpack_double}, are
233only supported with the helper built-in \code{_xdr} module, which
234relies on your operating system having the appropriate XDR library
235routines.
236
237If you have built the Python interpeter with the \code{_xdr} module,
238or have built the \code{_xdr} module as a shared library,
239\code{xdrlib} will use these to pack and unpack floating point
240numbers. Otherwise, using these routines will raise a
241\code{ConversionError} exception.
242
243See the Python installation instructions for details on building the
244\code{_xdr} module.