pack and unpack are useful tools for generating strings of bytes for interchange and extracting values from such strings respectively. What follows are two 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:
- There is more than one way to store signed integers. I believe that Perl only runs on machines that use two's complement for signed integers, so "Signed" refers to this format.
- < 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/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.)