问题
你想解析一个包含着二进制编码值的字符串,或者想把值编码为字符串。例如,你想以二进制表示法保存数值,而不是以ASCII字符的序列形式。
方案
使用pack()函数把二进制数据保存到一个字符串中:
<?php
$packed=pack('S4',1974,106,28225,32725);
//使用unpack()函数从一个字符串中抽取二进制数据
$nums=unpack('S4',$packed);
print_r($nums);
// 输出一个数组 Array( [1] => 1974 [2] => 106 [3] => 28225 [4] => 32725)
?>
讨论
传递给pack()参数的第一个参数是一个格式化字符串,用于描述 如何对其他参数进行编码。其中格式化字符串S4表示:
由输入的数据生成四位无符号的短16位数。对于给定的1974,106,28225和32725作为基于little-endian序列的计算机输入数据,
会生成8组数字:182,7,106,0,65,110,213,127。
其中每2个数字对应着一个输入的数据值,即7*256+182=1974;0*256+106=106;110*256+65=28225;127*256+213=32725.
传递给unpack()函数的第一个参数,也是一个格式化字符串;第二个参数则是要解码的数据。
在unpack()函数内部,格式化字符串以及其数目的后面还可以跟一个字符串,这个添加的字符串将作为数组的一个键。例如:
<?php
$packed=pack('S4',1974,106,28225,32725);
$nums=unpack('S4num',$packed);
print_r($nums);
//输出Array ( [num1] => 1974 [num2] => 106 [num3] => 28225 [num4] => 32725 )
?>
以下是用于pack()和unpack函数的格式化字符串
a 无填充的字符串
A 空格填充的字符串
h 16位字符串,以低四位开始
H 16位字符串,以高四位开始
c 带符号的字符
C 不带符号的字符
s 带符号的短整型数(always 16 bit, machine byte order)
S 无符号的短整型数 (always 16 bit, machine byte order)
n 无符号的短整型数 (always 16 bit, big endian byte order)
v 无符号的短整型数 (always 16 bit, little endian byte order)
i 带符号的整数 (machine dependent size and byte order)
I 无符号的整数 (machine dependent size and byte order)
l 带符号的长整型数 (always 32 bit, machine byte order)
L 无符号的长整型数 (always 32 bit, machine byte order)
N 无符号的长整型数 (always 32 bit, big endian byte order)
V 无符号的长整型数 (always 32 bit, little endian byte order)
q 带符号的超长整型数 (always 64 bit, machine byte order)
Q 无符号的超长整型数 (always 64 bit, machine byte order)
J 无符号的超长整型数 (always 64 bit, big endian byte order)
P 无符号的超长整型数 (always 64 bit, little endian byte order)
f 浮点型数 (大小和表示法与计算机相关)
d 双精度型数 (大小和表示法与计算机相关)
x 空字节
X 倒退一个字节
Z NUL-padded string (new in PHP 5.5)
@ 绝对位置以空值填充