PHP unpack() 函数根据给定的格式将二进制字符串中的数据解包到数组中。
解压后的数据存储在关联数组中。为了实现这一点,不同的格式代码应该命名并用斜杠 / 分隔。如果存在重复参数,则每个数组键将在给定名称后面有一个序列号。
已进行更改以使此函数与 Perl 一致,如下所述:
- "a"代码现在保留尾随 NULL 字节。
- "A"代码现在删除所有尾随 ASCII 空白(空格、制表符、换行符、回车符和 NULL 字节)。
- 为 NULL 填充字符串添加了"Z"代码,并删除了尾随的 NULL 字节。
语法
unpack(format, string, offset)
参数
format | 必填。 指定格式字符串由格式代码组成,后跟可选的重复参数。 Repeater 参数可以是整数值或 *,用于重复到输入数据的末尾。重复计数指定以下内容:
|
string | 必填。 指定打包数据。 |
offset | 可选。 指定开始解包的偏移量。默认值为 0。 |
unpack() 格式字符
代码 | 描述 |
---|---|
a | NUL 填充字符串 |
A | 空格填充字符串 |
h | 十六进制字符串,低半字节在前 |
H | 十六进制字符串,高半字节在前 |
c | 有符号字符 |
C | 无符号字符 |
s | 有符号短(始终16 位,机器字节顺序) |
S | 无符号短整型(始终为 16 位,机器字节顺序) |
n | 无符号短整型(始终为 16 位,大端字节顺序) |
v | 无符号短整型(始终为16 位,小端字节顺序) |
i | 有符号整数(取决于机器的大小和字节顺序) |
I | 无符号整数(取决于机器的大小和字节顺序) |
l | 有符号长整型(始终为 32 位,机器字节顺序) |
L | unsigned long(始终为32位,机器字节顺序) |
N | 无符号长整型(始终为 32 位,大端字节顺序) |
V | 无符号长整型(始终为 32 位) ,小端字节顺序) |
q | signed long long(始终为 64 位,机器字节顺序) |
Q | unsigned long long(始终为 64 位,机器字节顺序) |
J | unsigned long long (始终为 64 位,大端字节顺序) |
P | unsigned long long(始终为 64 位,小端字节顺序) |
f | float(取决于机器的大小和表示) |
g | float(取决于机器)大小,小端字节顺序) |
G | 浮点(机器相关大小,大端字节顺序) |
d | double(取决于机器的大小和表示) |
e | double(取决于机器的大小,小端序)字节顺序) |
E | double(机器相关大小,大端字节顺序) |
x | NUL字节 |
X | 备份一个字节 |
Z | NUL 填充字符串 |
@ | NUL 填充到绝对位置 |
返回值
返回包含二进制字符串解包元素的关联数组,失败时返回 false。
示例:unpack() 示例
下面的示例显示了unpack()函数的用法。
<?php
$binarydata = "\x04\x00\xa0\x00";
$array = unpack("cChars/nInt", $binarydata);
print_r($array);
?>
上述代码的输出将是:
Array
(
[Chars] => 4
[Int] => 160
)
示例:带有中继器的 unpack() 示例
在下面的示例中,格式参数包含中继器。
<?php
$binarydata = "\x04\x00\xa0\x00";
$array = unpack("c2Chars/nInt", $binarydata);
print_r($array);
?>
上述代码的输出将是:
Array
(
[Chars1] => 4
[Chars2] => 0
[Int] => 40960
)
示例:带有未命名键的 unpack() 示例
如果元素未命名,则使用从 1 开始的数字索引,如下例所示:
<?php
$binarydata = "\x32\x42\x00\xa0";
$array = unpack("c2/n", $binarydata);
print_r($array);
?>
上述代码的输出将是:
Array
(
[1] => 160
[2] => 66
)