php处理二进制数据

一、相关函数介绍

定义和用法
pack() 函数把数据装入一个二进制字符串。

语法
pack(format,args+)

参数	描述
format	必需。规定在包装数据时所使用的格式。
可能的值:

a - NUL 填充的字符串
A - SPACE 填充的字符串
h - 十六进制字符串,低位在前
H - 十六进制字符串,高位在前
c - signed char
C - unsigned char
s - signed short(总是16, machine 字节顺序)
S - unsigned short(总是16, machine 字节顺序)
n - unsigned short(总是16, big endian 字节顺序)
v - unsigned short(总是16, little endian 字节顺序)
i - signed integer(取决于machine的大小和字节顺序)
I - unsigned integer(取决于machine的大小和字节顺序)
l - signed long(总是32, machine 字节顺序)
L - unsigned long(总是32, machine 字节顺序)
N - unsigned long(总是32, big endian 字节顺序)
V - unsigned long(总是32, little endian 字节顺序)
f - float(取决于 machine 的大小和表示)
d - double(取决于 machine 的大小和表示)
x - NUL 字节
X - 备份一个字节
Z - NUL 填充的字符串
@ - NUL 填充绝对位置
args+	可选。规定被包装的一个或多个参数。
定义和用法
unpack() 函数从二进制字符串对数据进行解包。

语法
unpack(format,data)

参数	描述
format	必需。规定在解包数据时所使用的格式。
可能的值:

a - NUL 填充的字符串
A - SPACE 填充的字符串
h - 十六进制字符串,低位在前
H - 十六进制字符串,高位在前
c - signed char
C - unsigned char
s - signed short(总是16, machine 字节顺序)
S - unsigned short(总是16, machine 字节顺序)
n - unsigned short(总是16, big endian 字节顺序)
v - unsigned short(总是16, little endian 字节顺序)
i - signed integer(取决于 machine 的大小和字节顺序)
I - unsigned integer(取决于 machine 的大小和字节顺序)
l - signed long(总是32, machine 字节顺序)
L - unsigned long(总是32, machine 字节顺序)
N - unsigned long(总是32, big endian 字节顺序)
V - unsigned long(总是32, little endian 字节顺序)
f - float(取决于 machine 的大小和表示)
d - double(取决于 machine 的大小和表示)
x - NUL 字节
X - 备份一个字节
Z - NUL 填充的字符串
@ - NUL 填充绝对位置
data	必需。规定被解包的二进制数据。

二、数据类型占用字节数

在这里插入图片描述

三、函数使用

//代码
$a = base64_encode(pack("l", 82) . pack("f", 231.3) . 
	pack("f", 42) . pack("a3", "abc") . pack("a6", "张三"));

echo $a . '<br/>';

$b = base64_decode($a);

echo unpack('l', substr($b, 0, 4))[1] . '<br/>'; //int固定占用4个字节
echo unpack('f', substr($b, 4, 4))[1] . '<br/>'; //float固定占用4个字节
echo unpack('f', substr($b, 8, 4))[1] . '<br/>'; //float固定占用4个字节
echo unpack('a3', substr($b, 12, 3))[1] . '<br/>'; //一个英文占一个字节,所以是a3
echo unpack('a6', substr($b, 15, 6))[1] . '<br/>'; //一个中文占三个字节,所以2个字就是a6

汉字占用字节:GBK编码,一个汉字占两个字节。 UTF-8编码是变长编码,通常汉字占三个字节,扩展B区以后的汉字占四个字节。UTF-16 统一采用两个字节表示一个字符。

//打印结果
UgAAAM1MZ0MAAChCYWJj5byg5LiJ
82
231.30000305176
42
abc
张三

四、总结

通过以上代码,可以发现,解密时必须知道加密的规则,才能正常解密数据,所以使用二进制数据传递还可以提升数据的安全性,使用二进制然后base64加密之后,长度也会变短,可以提高数据的网络传输效率

猜你喜欢

转载自blog.csdn.net/LuoHuaX/article/details/127066014