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