Chủ Nhật, 12 tháng 2, 2012

Chapter 1. Strings [Storing Binary Data in Strings]


1.14. Storing Binary Data in Strings

1.14.3. Discussion

The first argument to pack( ) is a format string that describes how to encode the data that's passed in the rest of the arguments. The format string S4tells pack( ) to produce four unsigned short 16-bit numbers in machine byte order from its input data. Given 1974, 106, 28225, and 32725 as input, this returns eight bytes: 182, 7, 106, 0, 65, 110, 213, and 127. Each two-byte pair corresponds to one of the input numbers: 7 * 256 + 182 is 1974; 0 * 256 + 106 is 106; 110 * 256 + 65 = 28225; 127 * 256 + 213 = 32725.
The first argument to unpack( ) is also a format string, and the second argument is the data to decode. Passing a format string of S4, the eight-byte sequence that pack( ) produced returns a four-element array of the original numbers:
print_r($nums);
Array
(
    [1] => 1974
    [2] => 106
    [3] => 28225
    [4] => 32725
)
In unpack( ), format characters and their count can be followed by a string to be used as an array key. For example:
$nums = unpack('S4num',$packed);
print_r($nums);
Array
(
    [num1] => 1974
    [num2] => 106
    [num3] => 28225
    [num4] => 32725
)
Multiple format characters must be separated with / in unpack( ):
$nums = unpack('S1a/S1b/S1c/S1d',$packed);
print_r($nums);
Array
(
    [a] => 1974
    [b] => 106
    [c] => 28225
    [d] => 32725
)
The format characters that can be used with pack( ) and unpack( ) are listed in Table 1-2.

Table 1-2. Format characters for pack( ) and unpack( )

Format characterData type
aNUL-padded string
ASpace-padded string
hHex string, low nibble first
HHex string, high nibble first
csigned char
Cunsigned char
ssigned short (16 bit, machine byte order)
Sunsigned short (16 bit, machine byte order)
nunsigned short (16 bit, big endian byte order)
vunsigned short (16 bit, little endian byte order)
isigned int (machine-dependent size and byte order)
Iunsigned int (machine-dependent size and byte order)
lsigned long (32 bit, machine byte order)
Lunsigned long (32 bit, machine byte order)
Nunsigned long (32 bit, big endian byte order)
Vunsigned long (32 bit, little endian byte order)
ffloat (machine dependent size and representation)
ddouble (machine dependent size and representation)
xNUL byte
XBack up one byte
@NUL-fill to absolute position
For aAh, and H, a number after the format character indicates how long the string is. For example, A25 means a 25-character space-padded string. For other format characters, a following number means how many of that type appear consecutively in a string. Use * to take the rest of the available data.
You can convert between data types with unpack( ). This example fills the array $ascii with the ASCII values of each character in $s:
$s = 'platypus';
$ascii = unpack('c*',$s);
print_r($ascii);
Array
(
    [1] => 112
    [2] => 108
    [3] => 97
    [4] => 116
    [5] => 121
    [6] => 112
    [7] => 117
    [8] => 115
)

Không có nhận xét nào:

Đăng nhận xét