PHP在字符串中存储二进制数据
在PHP中,你可以解析一个包含着二进制编码值的字符串,或者可以把值编码为字符串。例如,你想以二进制表示法保存数值,而不以是ACSII字符的序列的形式。
使用pack()把二进制数据保存到一个字符串中:
<?php
$packed = pack('S4',1974,106,28225,32725);
?>
使用unpack()从一个字符串中抽取二进制数据:
<?php
$nums = unpack('S4',$packed);
?>
传递给pack()函数的第一个参数是一个用于描述如何对其他参数进行编码的格式化字符串。其中格式化字符串S4告诉pack(),按照计算机字节的序列由输入的数据生成四位无符号的短16位数。对于给定的1974, 106, 28225和32725作为基于little-endian序列的计算机输入数据,会生成8组数字:182, 7, 106, 0, 65, 110, 213和127。其中,每两个字节对应着一个输入的数据值,即7x256+182是1974, 0 x 256+106是106, 110 x 256+65=28225,127 x 256+213=327250
传递给unpack()函数的第一个参数也是一个格式化字符串,而第二个参数是要解码的数据。将S4作为格式化字符串,可以把由pack()函数生成的8组数字返回一个包含四个元素的数组,每个元素中保存着一个原始的数值。print_ r($nums)的输出结果为:
Array
(
[1] => 1974
[2] => 106
[3] => 28225
[4] => 32725
)
在unpack()函数内部,格式字符以及其数目的后面还可以加一个字符串,这个字符串将作为一个数组的键。例如:
<?php
$nums = unpack('S4num',$packed);
print_r($nums);
?>
其输出结果
Array
(
[num1] => 1974
[num2] => 106
[num3] => 28225
[num4] => 32725
)
如果要在unpack()函数中使用多个格式化字符,则必须使用/来分隔:
<?php
$nums = unpack('S1a/S1b/S1c/S1d',$packed);
print_r($nums);
?>
其输出结果
Array
(
[a] => 1974
[b] => 106
[c] => 28225
[d] => 32725
)
可以用在pack()和unpack()函数中的格式化字符见下表
a 无填充的字符串
A 空格填充的字符串
h 16位字符串,以低四位字节开始
H 16位字符串,以高四位字节开始
c 带符号的字符
C 无符号的字符
s 带符号的短整型数(16位,计算机字节序列)
S 无符号的短整型数(16位,计算机字节序列)
n 无符号的短整型数(16位,big endian字节序列)
v 无符号的短整型数(16位,little endian字节序列}
i 带符号的整数(大小与字节序列同计算机相关)
I 无符号的整数(大小与字节序列同计算机相关)
l 带符号的长整型数(32位,计算机字节序列)
L 无符号的长整型数(32位,计算机字节序列)
N 无符号的长整型数(32位,big endian字节序列)
V 无符号的长整型数(32位,little endian字节序列)
f 浮点型数(大小和表示法同计算机相关)
d 双精度型数(大小和表示法同计算机相关)
x 空字节
X 例退一个字节
@ 绝对位置以空值填充
对干a, A, h和H,将一个数字放在它们后面来表示这个字符串有多长。例如,A25表示一个25个字符的、以空格填充的字符串。对于其他格式化字符,后置的数字意味着相应的类型在字符串中出现多少次。使用*表示其余的现有数据。
<?php
$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
)
好了,PHP在字符串中存储二进制数据就介绍到这里了。
转载请注明:http://www.itivy.com/php/archive/2012/2/17/php-pack-unpack.html