在字符串中存储二进制数据的方法和要点

问题

你想解析一个包含着二进制编码值的字符串,或者想把值编码为字符串。例如,你想以二进制表示法保存数值,而不是以ASCII字符的序列形式。


方案

使用pack()函数把二进制数据保存到一个字符串中:

<?php
$packed=pack('S4',1974,106,28225,32725);

//使用unpack()函数从一个字符串中抽取二进制数据

$nums=unpack('S4',$packed);
print_r($nums);
// 输出一个数组 Array(   [1] => 1974   [2] => 106   [3] => 28225   [4] => 32725)
 ?>
讨论

传递给pack()参数的第一个参数是一个格式化字符串,用于描述 如何对其他参数进行编码。其中格式化字符串S4表示:

由输入的数据生成四位无符号的短16位数。对于给定的1974,106,28225和32725作为基于little-endian序列的计算机输入数据,

会生成8组数字:182,7,106,0,65,110,213,127。

其中每2个数字对应着一个输入的数据值,即7*256+182=1974;0*256+106=106;110*256+65=28225;127*256+213=32725.


传递给unpack()函数的第一个参数,也是一个格式化字符串;第二个参数则是要解码的数据。

在unpack()函数内部,格式化字符串以及其数目的后面还可以跟一个字符串,这个添加的字符串将作为数组的一个键。例如:

<?php
$packed=pack('S4',1974,106,28225,32725);

$nums=unpack('S4num',$packed);

print_r($nums);
//输出Array ( [num1] => 1974 [num2] => 106 [num3] => 28225 [num4] => 32725 ) 

?>


以下是用于pack()和unpack函数的格式化字符串
a 无填充的字符串
A 空格填充的字符串
h 16位字符串,以低四位开始
H 16位字符串,以高四位开始
c 带符号的字符
C 不带符号的字符
s 带符号的短整型数(always 16 bit, machine byte order)
S 无符号的短整型数 (always 16 bit, machine byte order)
n 无符号的短整型数 (always 16 bit, big endian byte order)
v 无符号的短整型数 (always 16 bit, little endian byte order)
i 带符号的整数 (machine dependent size and byte order)
I 无符号的整数 (machine dependent size and byte order)
l 带符号的长整型数 (always 32 bit, machine byte order)
L 无符号的长整型数 (always 32 bit, machine byte order)
N 无符号的长整型数 (always 32 bit, big endian byte order)
V 无符号的长整型数  (always 32 bit, little endian byte order)
q 带符号的超长整型数 (always 64 bit, machine byte order)
Q 无符号的超长整型数 (always 64 bit, machine byte order)
J 无符号的超长整型数 (always 64 bit, big endian byte order)
P 无符号的超长整型数 (always 64 bit, little endian byte order)
f 浮点型数 (大小和表示法与计算机相关)
d 双精度型数 (大小和表示法与计算机相关)
x 空字节
X 倒退一个字节
Z NUL-padded string (new in PHP 5.5)
@ 绝对位置以空值填充



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值