將數據打包成二進制字串

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

返回值

返回包含數據的二進制字串, 或者在失敗時返回 false

更新日誌

版本 說明
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*"0x12340x56786566);
?>

輸出結果為長度為 6 位元組的二進制字串,包含以下序列 0x12, 0x34, 0x78, 0x56, 0x41, 0x42。

註釋

警告

Note that PHP internally stores int values as signed values of a machine-dependent size (C type long). Integer literals and operations that yield numbers outside the bounds of the int type will be stored as float. When packing these floats as integers, they are first cast into the integer type. This may or may not result in the desired byte pattern.

The most relevant case is when packing unsigned numbers that would be representable with the int type if it were unsigned. In systems where the int type has a 32-bit size, the cast usually results in the same byte pattern as if the int were unsigned (although this relies on implementation-defined unsigned to signed conversions, as per the C standard). In systems where the int type has 64-bit size, the float most likely does not have a mantissa large enough to hold the value without loss of precision. If those systems also have a native 64-bit C int type (most UNIX-like systems don't), the only way to use the I pack format in the upper range is to create int negative values with the same byte representation as the desired unsigned value.

參見

  • unpack() - Unpack data from binary string

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *