blob: 705dd0feb62747aec1acfdeb6d284f4d277a9499 [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
141In addition, the following methods unpack strings, bytes, and opaque
142data:
143
144\begin{funcdesc}{unpack_fstring}{n}
145Unpacks and returns a fixed length string. \var{n} is the number of
146characters expected. Padding with null bytes to guaranteed 4 byte
147alignment is assumed.
148\end{funcdesc}
149
150\begin{funcdesc}{unpack_fopaque}{n}
151Unpacks and returns a fixed length opaque data stream, similarly to
152\code{unpack_fstring}.
153\end{funcdesc}
154
155\begin{funcdesc}{pack_string}{}
156Unpacks and returns a variable length string. The length of the
157string is first unpacked as an unsigned integer, then the string data
158is unpacked with \code{unpack_fstring}.
159\end{funcdesc}
160
161\begin{funcdesc}{unpack_opaque}{}
162Unpacks and returns a variable length opaque data string, similarly to
163\code{pack_string}.
164\end{funcdesc}
165
166\begin{funcdesc}{unpack_bytes}{}
167Unpacks and returns a variable length byte stream, similarly to
168\code{pack_string}.
169\end{funcdesc}
170
171The following methods support unpacking arrays and lists:
172
173\begin{funcdesc}{unpack_list}{unpack_item}
174Unpacks and returns a list of homogeneous items. The list is unpacked
175one element at a time
176by first unpacking an unsigned integer flag. If the flag is \code{1},
177then the item is unpacked and appended to the list. A flag of
178\code{0} indicates the end of the list. \var{unpack_item} is the
179function that is called to unpack the items.
180\end{funcdesc}
181
182\begin{funcdesc}{unpack_farray}{n\, unpack_item}
183Unpacks and returns (as a list) a fixed length array of homogeneous
184items. \var{n} is number of list elements to expect in the buffer.
185As above, \var{unpack_item} is the function used to unpack each element.
186\end{funcdesc}
187
188\begin{funcdesc}{unpack_array}{unpack_item}
189Unpacks and returns a variable length \var{list} of homogeneous items.
190First, the length of the list is unpacked as an unsigned integer, then
191each element is unpacked as in \code{unpack_farray} above.
192\end{funcdesc}
193
194\subsection{Exceptions}
195
196Exceptions in this module are coded as class instances:
197
198\begin{excdesc}{Error}
199The base exception class. \code{Error} has a single public data
200member \code{msg} containing the description of the error.
201\end{excdesc}
202
203\begin{excdesc}{ConversionError}
204Class derived from \code{Error}. Contains no additional instance
205variables.
206\end{excdesc}
207
208Here is an example of how you would catch one of these exceptions:
209
210\begin{verbatim}
211import xdrlib
212p = xdrlib.Packer()
213try:
214 p.pack_double(8.01)
215except xdrlib.ConversionError, instance:
216 print 'packing the double failed:', instance.msg
217\end{verbatim}
218
219\subsection{Supporting Floating Point Data}
220
221Packing and unpacking floating point data,
222i.e. \code{Packer.pack_float}, \code{Packer.pack_double},
223\code{Unpacker.unpack_float}, and \code{Unpacker.unpack_double}, are
224only supported with the helper built-in \code{_xdr} module, which
225relies on your operating system having the appropriate XDR library
226routines.
227
228If you have built the Python interpeter with the \code{_xdr} module,
229or have built the \code{_xdr} module as a shared library,
230\code{xdrlib} will use these to pack and unpack floating point
231numbers. Otherwise, using these routines will raise a
232\code{ConversionError} exception.
233
234See the Python installation instructions for details on building the
235\code{_xdr} module.