PHP 二进制 pack() unpack()

本文详细介绍了PHP5.6.3版本中新增的用于处理64位数的编码q、Q、J和P,以及对字符串格式化的改进。包括对数字、Unicode字符和二进制/十六进制数据的打包和解包功能。此外,还展示了如何通过pack和unpack函数进行数据转换和解析,以实现更高效的数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PHP 5.6.3 此版本加入"q", "Q", "J",低于此版本均不能使用
#5.6.3  The "q", "Q", "J" and "P" codes were added to enable working with 64-bit numbers.
#5.5.0  The "Z" code was added with equivalent functionality to "a" for Perl compatibility.
参数列表
Code    Description
a   NUL-padded string
A   SPACE-padded string
h   Hex string, low nibble first
H   Hex string, high nibble first
c   signed char
C   unsigned char
s   signed short (always 16 bit, machine byte order)
S   unsigned short (always 16 bit, machine byte order)
n   unsigned short (always 16 bit, big endian byte order)
v   unsigned short (always 16 bit, little endian byte order)
i   signed integer (machine dependent size and byte order)
I   unsigned integer (machine dependent size and byte order)
l   signed long (always 32 bit, machine byte order)
L   unsigned long (always 32 bit, machine byte order)
N   unsigned long (always 32 bit, big endian byte order)
V   unsigned long (always 32 bit, little endian byte order)
q   signed long long (always 64 bit, machine byte order)
Q   unsigned long long (always 64 bit, machine byte order)
J   unsigned long long (always 64 bit, big endian byte order)
P   unsigned long long (always 64 bit, little endian byte order)
f   float (machine dependent size and representation)
d   double (machine dependent size and representation)
x   NUL byte
X   Back up one byte
Z   NUL-padded string (new in PHP 5.5)
@   NUL-fill to absolute position
关于Pack:
string pack ( string $format [, mixed $args [, mixed $... ]] )

下面的第一部分把数字值包装成字节:  
$out = pack("CCCC", 65, 66, 67, 68);      # $out 等于"ABCD"  
$out = pack("C4", 65, 66, 67, 68);        # 一样的东西  

下面的对 Unicode 的循环字母做同样的事情:  
 $foo = pack("U4", 0x24b6, 0x24b7, 0x24b8, 0x24b9);  

下面的做类似的事情,增加了一些空:  
$out = pack("CCxxCC", 65, 66, 67, 68);   # $out 等于 "AB\0\0CD"  

打包你的短整数并不意味着你就可移植了:  
$out = pack("s2", 1, 2);          
# 在小头在前的机器上是 "\1\0\2\0"  
# 在大头在前的机器上是 "\0\1\0\2"  

在二进制和十六进制包装上,count 指的是位或者半字节的数量,而不是生成的字节数量:  
  $out = pack("B32", "...");  
  $out = pack("H8", "5065726c");         # 都生成“Perl”  

a 域里的长度只应用于一个字串:  
  $out = pack("a4", "abcd", "x", "y", "z");      # "abcd"  

要绕开这个限制,使用多倍声明:  
  $out = pack("aaaa",    "abcd", "x", "y", "z");   # "axyz"  
  $out = pack("a" x 4,   "abcd", "x", "y", "z");   # "axyz"  

a 格式做空填充:  
  $out = pack("a14", "abcdefg");    # " abcdefg\0\0\0\0\0\0"  
关于unpack:
array unpack ( string $format, string $data )  

$data = "010000020007";  
unpack("Sint1/Cchar1/Sint2/Cchar2",$data);  

# array('int1'=>1, 'char1'=>'0','int2'=>2,'char2'=>7);  
举例  协议格式如下:

包头(2bytes)+加密(1byte)+命令码(2bytes)+帧内容
1.包头的内容是记录帧内容的长度;
2.加密:0表示不加密,1表示加密;
3.命令码为服务端命令识别符号;

使用pack/unpack 举例程序代码为 :  
$lastact   = pack('SCSa32a32',0x0040, 0x00, 0x0006, $username, $passwd );  

unpack('Sint1/Cchar1/Sint2/Cchar2/',$lastmessage);  

感谢分享 参考资料
http://my.oschina.net/goal/blog/195749
http://www.03sec.com/3061.shtml
http://blog.sina.com.cn/s/blog_3eba8f1c0100nq9r.html
http://bbs.phpchina.com/thread-104492-1-1.html
http://www.neatstudio.com/show-2327-1.shtml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值