17db96d56Sopenharmony_ci:mod:`xdrlib` --- Encode and decode XDR data
27db96d56Sopenharmony_ci============================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: xdrlib
57db96d56Sopenharmony_ci   :synopsis: Encoders and decoders for the External Data Representation (XDR).
67db96d56Sopenharmony_ci   :deprecated:
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ci**Source code:** :source:`Lib/xdrlib.py`
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci.. index::
117db96d56Sopenharmony_ci   single: XDR
127db96d56Sopenharmony_ci   single: External Data Representation
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci.. deprecated-removed:: 3.11 3.13
157db96d56Sopenharmony_ci   The :mod:`xdrlib` module is deprecated
167db96d56Sopenharmony_ci   (see :pep:`PEP 594 <594#xdrlib>` for details).
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci--------------
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ciThe :mod:`xdrlib` module supports the External Data Representation Standard as
217db96d56Sopenharmony_cidescribed in :rfc:`1014`, written by Sun Microsystems, Inc. June 1987.  It
227db96d56Sopenharmony_cisupports most of the data types described in the RFC.
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ciThe :mod:`xdrlib` module defines two classes, one for packing variables into XDR
257db96d56Sopenharmony_cirepresentation, and another for unpacking from XDR representation.  There are
267db96d56Sopenharmony_cialso two exception classes.
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci.. class:: Packer()
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci   :class:`Packer` is the class for packing data into XDR representation. The
327db96d56Sopenharmony_ci   :class:`Packer` class is instantiated with no arguments.
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci.. class:: Unpacker(data)
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci   ``Unpacker`` is the complementary class which unpacks XDR data values from a
387db96d56Sopenharmony_ci   string buffer.  The input buffer is given as *data*.
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ci.. seealso::
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci   :rfc:`1014` - XDR: External Data Representation Standard
447db96d56Sopenharmony_ci      This RFC defined the encoding of data which was XDR at the time this module was
457db96d56Sopenharmony_ci      originally written.  It has apparently been obsoleted by :rfc:`1832`.
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ci   :rfc:`1832` - XDR: External Data Representation Standard
487db96d56Sopenharmony_ci      Newer RFC that provides a revised definition of XDR.
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ci.. _xdr-packer-objects:
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ciPacker Objects
547db96d56Sopenharmony_ci--------------
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ci:class:`Packer` instances have the following methods:
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci.. method:: Packer.get_buffer()
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ci   Returns the current pack buffer as a string.
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci.. method:: Packer.reset()
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci   Resets the pack buffer to the empty string.
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ciIn general, you can pack any of the most common XDR data types by calling the
697db96d56Sopenharmony_ciappropriate ``pack_type()`` method.  Each method takes a single argument, the
707db96d56Sopenharmony_civalue to pack.  The following simple data type packing methods are supported:
717db96d56Sopenharmony_ci:meth:`pack_uint`, :meth:`pack_int`, :meth:`pack_enum`, :meth:`pack_bool`,
727db96d56Sopenharmony_ci:meth:`pack_uhyper`, and :meth:`pack_hyper`.
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci.. method:: Packer.pack_float(value)
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ci   Packs the single-precision floating point number *value*.
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci.. method:: Packer.pack_double(value)
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci   Packs the double-precision floating point number *value*.
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_ciThe following methods support packing strings, bytes, and opaque data:
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci.. method:: Packer.pack_fstring(n, s)
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci   Packs a fixed length string, *s*.  *n* is the length of the string but it is
907db96d56Sopenharmony_ci   *not* packed into the data buffer.  The string is padded with null bytes if
917db96d56Sopenharmony_ci   necessary to guaranteed 4 byte alignment.
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci.. method:: Packer.pack_fopaque(n, data)
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci   Packs a fixed length opaque data stream, similarly to :meth:`pack_fstring`.
977db96d56Sopenharmony_ci
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ci.. method:: Packer.pack_string(s)
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci   Packs a variable length string, *s*.  The length of the string is first packed
1027db96d56Sopenharmony_ci   as an unsigned integer, then the string data is packed with
1037db96d56Sopenharmony_ci   :meth:`pack_fstring`.
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ci.. method:: Packer.pack_opaque(data)
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci   Packs a variable length opaque data string, similarly to :meth:`pack_string`.
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci.. method:: Packer.pack_bytes(bytes)
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci   Packs a variable length byte stream, similarly to :meth:`pack_string`.
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ciThe following methods support packing arrays and lists:
1167db96d56Sopenharmony_ci
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ci.. method:: Packer.pack_list(list, pack_item)
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci   Packs a *list* of homogeneous items.  This method is useful for lists with an
1217db96d56Sopenharmony_ci   indeterminate size; i.e. the size is not available until the entire list has
1227db96d56Sopenharmony_ci   been walked.  For each item in the list, an unsigned integer ``1`` is packed
1237db96d56Sopenharmony_ci   first, followed by the data value from the list.  *pack_item* is the function
1247db96d56Sopenharmony_ci   that is called to pack the individual item.  At the end of the list, an unsigned
1257db96d56Sopenharmony_ci   integer ``0`` is packed.
1267db96d56Sopenharmony_ci
1277db96d56Sopenharmony_ci   For example, to pack a list of integers, the code might appear like this::
1287db96d56Sopenharmony_ci
1297db96d56Sopenharmony_ci      import xdrlib
1307db96d56Sopenharmony_ci      p = xdrlib.Packer()
1317db96d56Sopenharmony_ci      p.pack_list([1, 2, 3], p.pack_int)
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci.. method:: Packer.pack_farray(n, array, pack_item)
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ci   Packs a fixed length list (*array*) of homogeneous items.  *n* is the length of
1377db96d56Sopenharmony_ci   the list; it is *not* packed into the buffer, but a :exc:`ValueError` exception
1387db96d56Sopenharmony_ci   is raised if ``len(array)`` is not equal to *n*.  As above, *pack_item* is the
1397db96d56Sopenharmony_ci   function used to pack each element.
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci.. method:: Packer.pack_array(list, pack_item)
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci   Packs a variable length *list* of homogeneous items.  First, the length of the
1457db96d56Sopenharmony_ci   list is packed as an unsigned integer, then each element is packed as in
1467db96d56Sopenharmony_ci   :meth:`pack_farray` above.
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ci.. _xdr-unpacker-objects:
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_ciUnpacker Objects
1527db96d56Sopenharmony_ci----------------
1537db96d56Sopenharmony_ci
1547db96d56Sopenharmony_ciThe :class:`Unpacker` class offers the following methods:
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_ci.. method:: Unpacker.reset(data)
1587db96d56Sopenharmony_ci
1597db96d56Sopenharmony_ci   Resets the string buffer with the given *data*.
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ci.. method:: Unpacker.get_position()
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci   Returns the current unpack position in the data buffer.
1657db96d56Sopenharmony_ci
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci.. method:: Unpacker.set_position(position)
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ci   Sets the data buffer unpack position to *position*.  You should be careful about
1707db96d56Sopenharmony_ci   using :meth:`get_position` and :meth:`set_position`.
1717db96d56Sopenharmony_ci
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_ci.. method:: Unpacker.get_buffer()
1747db96d56Sopenharmony_ci
1757db96d56Sopenharmony_ci   Returns the current unpack data buffer as a string.
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_ci
1787db96d56Sopenharmony_ci.. method:: Unpacker.done()
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ci   Indicates unpack completion.  Raises an :exc:`Error` exception if all of the
1817db96d56Sopenharmony_ci   data has not been unpacked.
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ciIn addition, every data type that can be packed with a :class:`Packer`, can be
1847db96d56Sopenharmony_ciunpacked with an :class:`Unpacker`.  Unpacking methods are of the form
1857db96d56Sopenharmony_ci``unpack_type()``, and take no arguments.  They return the unpacked object.
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ci
1887db96d56Sopenharmony_ci.. method:: Unpacker.unpack_float()
1897db96d56Sopenharmony_ci
1907db96d56Sopenharmony_ci   Unpacks a single-precision floating point number.
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci
1937db96d56Sopenharmony_ci.. method:: Unpacker.unpack_double()
1947db96d56Sopenharmony_ci
1957db96d56Sopenharmony_ci   Unpacks a double-precision floating point number, similarly to
1967db96d56Sopenharmony_ci   :meth:`unpack_float`.
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ciIn addition, the following methods unpack strings, bytes, and opaque data:
1997db96d56Sopenharmony_ci
2007db96d56Sopenharmony_ci
2017db96d56Sopenharmony_ci.. method:: Unpacker.unpack_fstring(n)
2027db96d56Sopenharmony_ci
2037db96d56Sopenharmony_ci   Unpacks and returns a fixed length string.  *n* is the number of characters
2047db96d56Sopenharmony_ci   expected.  Padding with null bytes to guaranteed 4 byte alignment is assumed.
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci
2077db96d56Sopenharmony_ci.. method:: Unpacker.unpack_fopaque(n)
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci   Unpacks and returns a fixed length opaque data stream, similarly to
2107db96d56Sopenharmony_ci   :meth:`unpack_fstring`.
2117db96d56Sopenharmony_ci
2127db96d56Sopenharmony_ci
2137db96d56Sopenharmony_ci.. method:: Unpacker.unpack_string()
2147db96d56Sopenharmony_ci
2157db96d56Sopenharmony_ci   Unpacks and returns a variable length string.  The length of the string is first
2167db96d56Sopenharmony_ci   unpacked as an unsigned integer, then the string data is unpacked with
2177db96d56Sopenharmony_ci   :meth:`unpack_fstring`.
2187db96d56Sopenharmony_ci
2197db96d56Sopenharmony_ci
2207db96d56Sopenharmony_ci.. method:: Unpacker.unpack_opaque()
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci   Unpacks and returns a variable length opaque data string, similarly to
2237db96d56Sopenharmony_ci   :meth:`unpack_string`.
2247db96d56Sopenharmony_ci
2257db96d56Sopenharmony_ci
2267db96d56Sopenharmony_ci.. method:: Unpacker.unpack_bytes()
2277db96d56Sopenharmony_ci
2287db96d56Sopenharmony_ci   Unpacks and returns a variable length byte stream, similarly to
2297db96d56Sopenharmony_ci   :meth:`unpack_string`.
2307db96d56Sopenharmony_ci
2317db96d56Sopenharmony_ciThe following methods support unpacking arrays and lists:
2327db96d56Sopenharmony_ci
2337db96d56Sopenharmony_ci
2347db96d56Sopenharmony_ci.. method:: Unpacker.unpack_list(unpack_item)
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ci   Unpacks and returns a list of homogeneous items.  The list is unpacked one
2377db96d56Sopenharmony_ci   element at a time by first unpacking an unsigned integer flag.  If the flag is
2387db96d56Sopenharmony_ci   ``1``, then the item is unpacked and appended to the list.  A flag of ``0``
2397db96d56Sopenharmony_ci   indicates the end of the list.  *unpack_item* is the function that is called to
2407db96d56Sopenharmony_ci   unpack the items.
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ci
2437db96d56Sopenharmony_ci.. method:: Unpacker.unpack_farray(n, unpack_item)
2447db96d56Sopenharmony_ci
2457db96d56Sopenharmony_ci   Unpacks and returns (as a list) a fixed length array of homogeneous items.  *n*
2467db96d56Sopenharmony_ci   is number of list elements to expect in the buffer. As above, *unpack_item* is
2477db96d56Sopenharmony_ci   the function used to unpack each element.
2487db96d56Sopenharmony_ci
2497db96d56Sopenharmony_ci
2507db96d56Sopenharmony_ci.. method:: Unpacker.unpack_array(unpack_item)
2517db96d56Sopenharmony_ci
2527db96d56Sopenharmony_ci   Unpacks and returns a variable length *list* of homogeneous items. First, the
2537db96d56Sopenharmony_ci   length of the list is unpacked as an unsigned integer, then each element is
2547db96d56Sopenharmony_ci   unpacked as in :meth:`unpack_farray` above.
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci
2577db96d56Sopenharmony_ci.. _xdr-exceptions:
2587db96d56Sopenharmony_ci
2597db96d56Sopenharmony_ciExceptions
2607db96d56Sopenharmony_ci----------
2617db96d56Sopenharmony_ci
2627db96d56Sopenharmony_ciExceptions in this module are coded as class instances:
2637db96d56Sopenharmony_ci
2647db96d56Sopenharmony_ci
2657db96d56Sopenharmony_ci.. exception:: Error
2667db96d56Sopenharmony_ci
2677db96d56Sopenharmony_ci   The base exception class.  :exc:`Error` has a single public attribute
2687db96d56Sopenharmony_ci   :attr:`msg` containing the description of the error.
2697db96d56Sopenharmony_ci
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ci.. exception:: ConversionError
2727db96d56Sopenharmony_ci
2737db96d56Sopenharmony_ci   Class derived from :exc:`Error`.  Contains no additional instance variables.
2747db96d56Sopenharmony_ci
2757db96d56Sopenharmony_ciHere is an example of how you would catch one of these exceptions::
2767db96d56Sopenharmony_ci
2777db96d56Sopenharmony_ci   import xdrlib
2787db96d56Sopenharmony_ci   p = xdrlib.Packer()
2797db96d56Sopenharmony_ci   try:
2807db96d56Sopenharmony_ci       p.pack_double(8.01)
2817db96d56Sopenharmony_ci   except xdrlib.ConversionError as instance:
2827db96d56Sopenharmony_ci       print('packing the double failed:', instance.msg)
2837db96d56Sopenharmony_ci
284