PHP 杂项函数

PHP unpack() 函数根据给定的格式将二进制字符串中的数据解包到数组中。

解压后的数据存储在关联数组中。为了实现这一点,不同的格式代码应该命名并用斜杠 / 分隔。如果存在重复参数,则每个数组键将在给定名称后面有一个序列号。

已进行更改以使此函数与 Perl 一致,如下所述:

  • "a"代码现在保留尾随 NULL 字节。
  • "A"代码现在删除所有尾随 ASCII 空白(空格、制表符、换行符、回车符和 NULL 字节)。
  • 为 NULL 填充字符串添加了"Z"代码,并删除了尾随的 NULL 字节。

语法

unpack(format, string, offset) 

参数

format必填。 指定格式字符串由格式代码组成,后跟可选的重复参数。 Repeater 参数可以是整数值或 *,用于重复到输入数据的末尾。重复计数指定以下内容:
  • 对于 a、A、h、H,它指定一个数据参数的字符数
  • 对于 @,它是放置数据的绝对位置下一个数据,
  • 对于其他所有内容,它指定使用多少数据参数并将其打包到生成的二进制字符串中。
当前实现的格式如下表所示:
string必填。 指定打包数据。
offset可选。 指定开始解包的偏移量。默认值为 0。

unpack() 格式字符

代码描述
aNUL 填充字符串
A空格填充字符串
h十六进制字符串,低半字节在前
H十六进制字符串,高半字节在前
c有符号字符
C无符号字符
s有符号短(始终16 位,机器字节顺序)
S无符号短整型(始终为 16 位,机器字节顺序)
n无符号短整型(始终为 16 位,大端字节顺序)
v无符号短整型(始终为16 位,小端字节顺序)
i有符号整数(取决于机器的大小和字节顺序)
I无符号整数(取决于机器的大小和字节顺序)
l有符号长整型(始终为 32 位,机器字节顺序)
Lunsigned long(始终为32位,机器字节顺序)
N无符号长整型(始终为 32 位,大端字节顺序)
V无符号长整型(始终为 32 位) ,小端字节顺序)
qsigned long long(始终为 64 位,机器字节顺序)
Qunsigned long long(始终为 64 位,机器字节顺序)
Junsigned long long (始终为 64 位,大端字节顺序)
Punsigned long long(始终为 64 位,小端字节顺序)
ffloat(取决于机器的大小和表示)
gfloat(取决于机器)大小,小端字节顺序)
G浮点(机器相关大小,大端字节顺序)
ddouble(取决于机器的大小和表示)
edouble(取决于机器的大小,小端序)字节顺序)
Edouble(机器相关大小,大端字节顺序)
xNUL字节
X备份一个字节
ZNUL 填充字符串
@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
)