Home | History | Annotate | Download | only in library
      1 :mod:`xdrlib` --- Encode and decode XDR data
      2 ============================================
      3 
      4 .. module:: xdrlib
      5    :synopsis: Encoders and decoders for the External Data Representation (XDR).
      6 
      7 
      8 .. index::
      9    single: XDR
     10    single: External Data Representation
     11 
     12 **Source code:** :source:`Lib/xdrlib.py`
     13 
     14 --------------
     15 
     16 The :mod:`xdrlib` module supports the External Data Representation Standard as
     17 described in :rfc:`1014`, written by Sun Microsystems, Inc. June 1987.  It
     18 supports most of the data types described in the RFC.
     19 
     20 The :mod:`xdrlib` module defines two classes, one for packing variables into XDR
     21 representation, and another for unpacking from XDR representation.  There are
     22 also two exception classes.
     23 
     24 
     25 .. class:: Packer()
     26 
     27    :class:`Packer` is the class for packing data into XDR representation. The
     28    :class:`Packer` class is instantiated with no arguments.
     29 
     30 
     31 .. class:: Unpacker(data)
     32 
     33    ``Unpacker`` is the complementary class which unpacks XDR data values from a
     34    string buffer.  The input buffer is given as *data*.
     35 
     36 
     37 .. seealso::
     38 
     39    :rfc:`1014` - XDR: External Data Representation Standard
     40       This RFC defined the encoding of data which was XDR at the time this module was
     41       originally written.  It has apparently been obsoleted by :rfc:`1832`.
     42 
     43    :rfc:`1832` - XDR: External Data Representation Standard
     44       Newer RFC that provides a revised definition of XDR.
     45 
     46 
     47 .. _xdr-packer-objects:
     48 
     49 Packer Objects
     50 --------------
     51 
     52 :class:`Packer` instances have the following methods:
     53 
     54 
     55 .. method:: Packer.get_buffer()
     56 
     57    Returns the current pack buffer as a string.
     58 
     59 
     60 .. method:: Packer.reset()
     61 
     62    Resets the pack buffer to the empty string.
     63 
     64 In general, you can pack any of the most common XDR data types by calling the
     65 appropriate ``pack_type()`` method.  Each method takes a single argument, the
     66 value to pack.  The following simple data type packing methods are supported:
     67 :meth:`pack_uint`, :meth:`pack_int`, :meth:`pack_enum`, :meth:`pack_bool`,
     68 :meth:`pack_uhyper`, and :meth:`pack_hyper`.
     69 
     70 
     71 .. method:: Packer.pack_float(value)
     72 
     73    Packs the single-precision floating point number *value*.
     74 
     75 
     76 .. method:: Packer.pack_double(value)
     77 
     78    Packs the double-precision floating point number *value*.
     79 
     80 The following methods support packing strings, bytes, and opaque data:
     81 
     82 
     83 .. method:: Packer.pack_fstring(n, s)
     84 
     85    Packs a fixed length string, *s*.  *n* is the length of the string but it is
     86    *not* packed into the data buffer.  The string is padded with null bytes if
     87    necessary to guaranteed 4 byte alignment.
     88 
     89 
     90 .. method:: Packer.pack_fopaque(n, data)
     91 
     92    Packs a fixed length opaque data stream, similarly to :meth:`pack_fstring`.
     93 
     94 
     95 .. method:: Packer.pack_string(s)
     96 
     97    Packs a variable length string, *s*.  The length of the string is first packed
     98    as an unsigned integer, then the string data is packed with
     99    :meth:`pack_fstring`.
    100 
    101 
    102 .. method:: Packer.pack_opaque(data)
    103 
    104    Packs a variable length opaque data string, similarly to :meth:`pack_string`.
    105 
    106 
    107 .. method:: Packer.pack_bytes(bytes)
    108 
    109    Packs a variable length byte stream, similarly to :meth:`pack_string`.
    110 
    111 The following methods support packing arrays and lists:
    112 
    113 
    114 .. method:: Packer.pack_list(list, pack_item)
    115 
    116    Packs a *list* of homogeneous items.  This method is useful for lists with an
    117    indeterminate size; i.e. the size is not available until the entire list has
    118    been walked.  For each item in the list, an unsigned integer ``1`` is packed
    119    first, followed by the data value from the list.  *pack_item* is the function
    120    that is called to pack the individual item.  At the end of the list, an unsigned
    121    integer ``0`` is packed.
    122 
    123    For example, to pack a list of integers, the code might appear like this::
    124 
    125       import xdrlib
    126       p = xdrlib.Packer()
    127       p.pack_list([1, 2, 3], p.pack_int)
    128 
    129 
    130 .. method:: Packer.pack_farray(n, array, pack_item)
    131 
    132    Packs a fixed length list (*array*) of homogeneous items.  *n* is the length of
    133    the list; it is *not* packed into the buffer, but a :exc:`ValueError` exception
    134    is raised if ``len(array)`` is not equal to *n*.  As above, *pack_item* is the
    135    function used to pack each element.
    136 
    137 
    138 .. method:: Packer.pack_array(list, pack_item)
    139 
    140    Packs a variable length *list* of homogeneous items.  First, the length of the
    141    list is packed as an unsigned integer, then each element is packed as in
    142    :meth:`pack_farray` above.
    143 
    144 
    145 .. _xdr-unpacker-objects:
    146 
    147 Unpacker Objects
    148 ----------------
    149 
    150 The :class:`Unpacker` class offers the following methods:
    151 
    152 
    153 .. method:: Unpacker.reset(data)
    154 
    155    Resets the string buffer with the given *data*.
    156 
    157 
    158 .. method:: Unpacker.get_position()
    159 
    160    Returns the current unpack position in the data buffer.
    161 
    162 
    163 .. method:: Unpacker.set_position(position)
    164 
    165    Sets the data buffer unpack position to *position*.  You should be careful about
    166    using :meth:`get_position` and :meth:`set_position`.
    167 
    168 
    169 .. method:: Unpacker.get_buffer()
    170 
    171    Returns the current unpack data buffer as a string.
    172 
    173 
    174 .. method:: Unpacker.done()
    175 
    176    Indicates unpack completion.  Raises an :exc:`Error` exception if all of the
    177    data has not been unpacked.
    178 
    179 In addition, every data type that can be packed with a :class:`Packer`, can be
    180 unpacked with an :class:`Unpacker`.  Unpacking methods are of the form
    181 ``unpack_type()``, and take no arguments.  They return the unpacked object.
    182 
    183 
    184 .. method:: Unpacker.unpack_float()
    185 
    186    Unpacks a single-precision floating point number.
    187 
    188 
    189 .. method:: Unpacker.unpack_double()
    190 
    191    Unpacks a double-precision floating point number, similarly to
    192    :meth:`unpack_float`.
    193 
    194 In addition, the following methods unpack strings, bytes, and opaque data:
    195 
    196 
    197 .. method:: Unpacker.unpack_fstring(n)
    198 
    199    Unpacks and returns a fixed length string.  *n* is the number of characters
    200    expected.  Padding with null bytes to guaranteed 4 byte alignment is assumed.
    201 
    202 
    203 .. method:: Unpacker.unpack_fopaque(n)
    204 
    205    Unpacks and returns a fixed length opaque data stream, similarly to
    206    :meth:`unpack_fstring`.
    207 
    208 
    209 .. method:: Unpacker.unpack_string()
    210 
    211    Unpacks and returns a variable length string.  The length of the string is first
    212    unpacked as an unsigned integer, then the string data is unpacked with
    213    :meth:`unpack_fstring`.
    214 
    215 
    216 .. method:: Unpacker.unpack_opaque()
    217 
    218    Unpacks and returns a variable length opaque data string, similarly to
    219    :meth:`unpack_string`.
    220 
    221 
    222 .. method:: Unpacker.unpack_bytes()
    223 
    224    Unpacks and returns a variable length byte stream, similarly to
    225    :meth:`unpack_string`.
    226 
    227 The following methods support unpacking arrays and lists:
    228 
    229 
    230 .. method:: Unpacker.unpack_list(unpack_item)
    231 
    232    Unpacks and returns a list of homogeneous items.  The list is unpacked one
    233    element at a time by first unpacking an unsigned integer flag.  If the flag is
    234    ``1``, then the item is unpacked and appended to the list.  A flag of ``0``
    235    indicates the end of the list.  *unpack_item* is the function that is called to
    236    unpack the items.
    237 
    238 
    239 .. method:: Unpacker.unpack_farray(n, unpack_item)
    240 
    241    Unpacks and returns (as a list) a fixed length array of homogeneous items.  *n*
    242    is number of list elements to expect in the buffer. As above, *unpack_item* is
    243    the function used to unpack each element.
    244 
    245 
    246 .. method:: Unpacker.unpack_array(unpack_item)
    247 
    248    Unpacks and returns a variable length *list* of homogeneous items. First, the
    249    length of the list is unpacked as an unsigned integer, then each element is
    250    unpacked as in :meth:`unpack_farray` above.
    251 
    252 
    253 .. _xdr-exceptions:
    254 
    255 Exceptions
    256 ----------
    257 
    258 Exceptions in this module are coded as class instances:
    259 
    260 
    261 .. exception:: Error
    262 
    263    The base exception class.  :exc:`Error` has a single public attribute
    264    :attr:`msg` containing the description of the error.
    265 
    266 
    267 .. exception:: ConversionError
    268 
    269    Class derived from :exc:`Error`.  Contains no additional instance variables.
    270 
    271 Here is an example of how you would catch one of these exceptions::
    272 
    273    import xdrlib
    274    p = xdrlib.Packer()
    275    try:
    276        p.pack_double(8.01)
    277    except xdrlib.ConversionError as instance:
    278        print 'packing the double failed:', instance.msg
    279