\section{Built-in Module \sectcode{struct}}
\bimodindex{struct}
\indexii{C}{structures}

This module performs conversions between Python values and C
structs represented as Python strings.  It uses \dfn{format strings}
(explained below) as compact descriptions of the lay-out of the C
structs and the intended conversion to/from Python values.

See also built-in module \code{array}.
\bimodindex{array}

The module defines the following exception and functions:

\renewcommand{\indexsubitem}{(in module struct)}
\begin{excdesc}{error}
  Exception raised on various occasions; argument is a string
  describing what is wrong.
\end{excdesc}

\begin{funcdesc}{pack}{fmt\, v1\, v2\, {\rm \ldots}}
  Return a string containing the values
  \code{\var{v1}, \var{v2}, {\rm \ldots}} packed according to the given
  format.  The arguments must match the values required by the format
  exactly.
\end{funcdesc}

\begin{funcdesc}{unpack}{fmt\, string}
  Unpack the string (presumably packed by \code{pack(\var{fmt}, {\rm \ldots})})
  according to the given format.  The result is a tuple even if it
  contains exactly one item.  The string must contain exactly the
  amount of data required by the format (i.e.  \code{len(\var{string})} must
  equal \code{calcsize(\var{fmt})}).
\end{funcdesc}

\begin{funcdesc}{calcsize}{fmt}
  Return the size of the struct (and hence of the string)
  corresponding to the given format.
\end{funcdesc}

Format characters have the following meaning; the conversion between C
and Python values should be obvious given their types:

\begin{tableiii}{|c|l|l|}{samp}{Format}{C}{Python}
  \lineiii{x}{pad byte}{no value}
  \lineiii{c}{char}{string of length 1}
  \lineiii{b}{signed char}{integer}
  \lineiii{B}{unsigned char}{integer}
  \lineiii{h}{short}{integer}
  \lineiii{H}{unsigned short}{integer}
  \lineiii{i}{int}{integer}
  \lineiii{I}{unsigned int}{integer}
  \lineiii{l}{long}{integer}
  \lineiii{L}{unsigned long}{integer}
  \lineiii{f}{float}{float}
  \lineiii{d}{double}{float}
  \lineiii{s}{char[]}{string}
\end{tableiii}

A format character may be preceded by an integral repeat count; e.g.\
the format string \code{'4h'} means exactly the same as \code{'hhhh'}.

For the \code{'s'} format character, the count is interpreted as the
size of the string, not a repeat count like for the other format
characters; e.g. \code{'10s'} means a single 10-byte string, while
\code{'10c'} means 10 characters.  For packing, the string is
truncated or padded with null bytes as appropriate to make it fit.
For unpacking, the resulting string always has exactly the specified
number of bytes.  As a special case, \code{'0s'} means a single, empty
string (while \code{'0c'} means 0 characters).

For the \code{'I'} and \code{'L'} format characters, the return
value is a Python long integer.

By default, C numbers are represented in the machine's native format
and byte order, and properly aligned by skipping pad bytes if
necessary (according to the rules used by the C compiler).

Alternatively, the first character of the format string can be used to
indicate the byte order, size and alignment of the packed data,
according to the following table:

\begin{tableiii}{|c|l|l|}{samp}{Character}{Byte order}{Size and alignment}
  \lineiii{@}{native}{native}
  \lineiii{=}{native}{standard}
  \lineiii{<}{little-endian}{standard}
  \lineiii{>}{big-endian}{standard}
  \lineiii{!}{network (= big-endian)}{standard}
\end{tableiii}

If the first character is not one of these, \code{'@'} is assumed.

Native byte order is big-endian or little-endian, depending on the
host system (e.g. Motorola and Sun are big-endian; Intel and DEC are
little-endian).

Native size and alignment are determined using the C compiler's sizeof
expression.  This is always combined with native byte order.

Standard size and alignment are as follows: no alignment is required
for any type (so you have to use pad bytes); short is 2 bytes; int and
long are 4 bytes.  Float and double are 32-bit and 64-bit IEEE floating
point numbers, respectively.

Note the difference between \code{'@'} and \code{'='}: both use native
byte order, but the size and alignment of the latter is standardized.

The form \code{'!'} is available for those poor souls who claim they
can't remember whether network byte order is big-endian or
little-endian.

There is no way to indicate non-native byte order (i.e. force
byte-swapping); use the appropriate choice of \code{'<'} or
\code{'>'}.

Examples (all using native byte order, size and alignment, on a
big-endian machine):

\bcode\begin{verbatim}
>>> from struct import *
>>> pack('hhl', 1, 2, 3)
'\000\001\000\002\000\000\000\003'
>>> unpack('hhl', '\000\001\000\002\000\000\000\003')
(1, 2, 3)
>>> calcsize('hhl')
8
>>> 
\end{verbatim}\ecode

Hint: to align the end of a structure to the alignment requirement of
a particular type, end the format with the code for that type with a
repeat count of zero, e.g.\ the format \code{'llh0l'} specifies two
pad bytes at the end, assuming longs are aligned on 4-byte boundaries.
(This only works when native size and alignment are in effect;
standard size and alignment does not enforce any alignment.)
