pack and unpack are useful tools for generating strings of bytes for interchange and extracting values from such strings respectively. What follows is a table that represents the relevant formats in a convenient form.
Category | Type | Byte Order | Mnemonic | |||
---|---|---|---|---|---|---|
Native | Little-Endian (<) | Big-Endian (>) | ||||
Fixed-Size Integers | 8-bit integer | Unsigned | C | "C" for char | ||
Signed | c | |||||
16-bit integer | Unsigned | S | S< or v | S> or n | "S" for short | |
Signed | s | s< or v! | s> or n! | |||
32-bit integer | Unsigned | L | L< or V | L> or N | "L" for long | |
Signed | l | l< or V! | l> or N! | |||
64-bit integer | Unsigned | Q | Q< | Q> | "Q" for quad | |
Signed | q | q< | q> | |||
Types Used By This Build of perl | UV (unsigned integer) | J | J< | J> | "J" is related to "I" | |
IV (signed integer) | j | j< | j> | |||
NV (floating-point) | F | F< | F> | "F" for float | ||
Underlying C Types for This Build of perl | char | — | — | — | ||
unsigned char | — | — | — | |||
signed char | — | — | — | |||
unsigned short int | S! | S!< | S!> | "S" for short | ||
signed short int | s! | s!< | s!> | |||
unsigned int | I! or I | I!< or I< | I!> or I> | "I" for int | ||
signed int | i! or i | i!< or i< | i!> or i> | |||
unsigned long int | L! | L!< | L!> | "L" for long | ||
signed long int | l! | l!< | l!> | |||
unsigned long long int | — | — | — | |||
signed long long int | — | — | — | |||
float | f | f< | f> | "f" for float | ||
double | d | d< | d> | "d" for double | ||
long double | D | D< | D> | A bigger double |
For the pointers used by this build of perl, you can use the following:
use Config qw( %Config ); use constant PTR_SIZE => $Config{ptrsize}; use constant PTR_PACK_FORMAT => PTR_SIZE == 8 ? 'Q' : PTR_SIZE == 4 ? 'L' : die("Unrecognized ptrsize\n");
Notes:
- < and > indicate byte order. The small end of the bracket is at the least significant end of the number. (< for little-endian byte order, and > for big-endian byte order.) Can't be used with N/n and V/v.
- For integers, ! signifies using the C types of this build of perl. Exception: N/n/V/v.
- For integers, uppercase indicates unsigned, and lowercase indicates signed. Exception: N/n and V/v.
- N and n are used for network (i.e. internet) byte order (BE), with the uppercase letter being used for the larger bitsize.
- V and v are used for VAX byte order (LE), with the uppercase letter being used for the larger bitsize.
- Using Q/q requires a Perl with 64 bit integers.
- Unsupported types:
- unsigned long long int (Q! would be an obvious choice for it.)
- signed long long int (q! would be an obvious choice for it.)
- char
- unsigned char (C! would be an obvious choice for it.)
- signed char (c! would be an obvious choice for it.)
Back to
Meditations