pack

(PHP 4, PHP 5, PHP 7, PHP 8)

pack将数据打包成二进制字符串

说明

pack(string $format, mixed ...$values): string

将输入参数打包成 format 格式的二进制字符串。

这个函数的思想来自 Perl,所有格式化代码(format)的工作原理都与 Perl 相同。 但是,缺少了部分格式代码,比如 Perl 的 “u”。

注意,有符号值和无符号值之间的区别只影响函数 unpack(),在那些使用有符号和无符号格式代码的地方 pack() 函数产生相同的结果。

参数

format

format 字符串由格式代码组成,后面跟着一个可选的重复参数。重复参数可以是一个整数值或者 * 值来重复到输入数据的末尾。对于 a, A, h, H 格式化代码,其后的重复参数指定了给定数据将会被使用几个字符串。对于 @,其后的数字表示放置剩余数据的绝对定位(之前的数据将会被空字符串填充),对于其他所有内容,重复数量指定消耗多少个数据参数并将其打包到生成的二进制字符串中。

目前已实现的格式如下:

pack() 格式字符
代码 描述
a 以 NUL 字节填充字符串
A 以 SPACE(空格) 填充字符串
h 十六进制字符串,低位在前
H 十六进制字符串,高位在前
c有符号字符
C 无符号字符
s 有符号短整型(16位,主机字节序)
S 无符号短整型(16位,主机字节序)
n 无符号短整型(16位,大端字节序)
v 无符号短整型(16位,小端字节序)
i 有符号整型(机器相关大小字节序)
I 无符号整型(机器相关大小字节序)
l 有符号长整型(32位,主机字节序)
L 无符号长整型(32位,主机字节序)
N 无符号长整型(32位,大端字节序)
V 无符号长整型(32位,小端字节序)
q 有符号长长整型(64位,主机字节序)
Q 无符号长长整型(64位,主机字节序)
J 无符号长长整型(64位,大端字节序)
P 无符号长长整型(64位,小端字节序)
f 单精度浮点型(机器相关大小)
g 单精度浮点型(机器相关大小,小端字节序)
G 单精度浮点型(机器相关大小,大端字节序)
d 双精度浮点型(机器相关大小)
e 双精度浮点型(机器相关大小,小端字节序)
E 双精度浮点型(机器相关大小,大端字节序)
x NUL 字节
X 回退一字节
Z 以 NUL 字节填充字符串空白
@ NUL 填充到绝对位置

values

返回值

返回包含数据的二进制字符串。

更新日志

版本 说明
8.0.0 此函数不再在失败时返回 false
7.2.0 floatdouble 类型支持大端和小端。
7.0.15,7.1.1 添加了 “e”,“E”,“g” 和 “G” 代码以启用 float 和 double 的字节顺序支持。

示例

示例 #1 pack() 示例

<?php
$binarydata
= pack("nvc*", 0x1234, 0x5678, 65, 66);
?>

输出结果为长度为 6 字节的二进制字符串,包含以下序列 0x12, 0x34, 0x78, 0x56, 0x41, 0x42。

注释

警告

注意,PHP 内部将以有符号的形式存储 int 值,其大小取决于机器。整数文字和运算的结果超出 int 类型范围,将存储为 float。将这些浮点数打包为整数时,首先会转换为整数类型。这一过程可能不会产生预期的字节模式。

最典型的情况是当要打包那些无符号 int 类型就可以表示的无符号数字。在 int 类型为 32 位的系统中,转换通常会产生与 int 类型为无符号时相同的字节模式(尽管这取决于 C 标准中定义的、由具体实现决定的无符号转有符号规则)。对于 int 类型为 64 位的系统,float 可能无法提供足够的尾数位数来保存值而不会损失精度。如果这些系统也支持本地 64 位 C int 类型(多数类 UNIX 系统并不支持),那么要在高范围使用 I 打包格式的唯一办法就是创建与预期的无符号值具有相同字节表示的负整数值。

参见

  • unpack() - Unpack data from binary string