本文目录导读:

- 基础:字符串与字节的关系
- 核心函数:
chr()和ord() - 读取/写入字节(文件处理)
- 字节遍历与操作
- 字节与十六进制转换
- 字节数组与网络协议(套接字)
- 常见陷阱与注意事项
- 位操作扩展(
扩展PHP > 5.0) - 常用字节处理速查表
在 PHP 中,字节处理通常涉及对二进制数据、文件、网络数据等的操作,PHP 提供了丰富的函数来处理字节级别的问题。
以下是 PHP 字节处理的核心知识点和实用技巧:
基础:字符串与字节的关系
在 PHP 中,一个字符串本质上就是一个字节数组,你可以使用下标访问字符串中的字节(单字节字符)。
$str = "ABC"; echo $str[0]; // 输出 "A"(ASCII 65) echo $str[1]; // 输出 "B"
注意:PHP 没有原生的 byte 类型,但 chr() 和 ord() 用于字节与整数之间的转换。
核心函数:chr() 和 ord()
这两个函数是字节处理的基础。
ord(string $character): int:返回字符的 ASCII 码值(0-255)。chr(int $byte): string:返回指定 ASCII 码对应的单字节字符。
// 获取 'A' 的 ASCII 值
$ascii = ord('A'); // 65
// 将 65 转回字符
$char = chr(65); // "A"
// 生成二进制数据(如 0x00 到 0xFF)
$binary = chr(0x00) . chr(0xFF);
读取/写入字节(文件处理)
(1) 读取整个文件为字节
// 读取二进制文件
$data = file_get_contents('image.png'); // $data 是二进制字符串
echo strlen($data); // 输出字节长度
(2) 按字节读取
使用 fread() 或 fgets() 来读取指定长度的字节。
$handle = fopen('file.bin', 'rb');
if ($handle) {
// 一次读取 1024 字节
$chunk = fread($handle, 1024);
fclose($handle);
}
(3) 写入字节
使用 fwrite() 写入二进制数据。
$data = chr(0x01) . chr(0x02) . chr(0x03);
file_put_contents('output.bin', $data);
字节遍历与操作
(1) 遍历字符串中的每个字节
$str = "Hello";
for ($i = 0; $i < strlen($str); $i++) {
$byte = $str[$i];
echo ord($byte) . " "; // 输出 ASCII 值
}
// 输出: 72 101 108 108 111
(2) 使用 unpack() 解析二进制数据(重点)
unpack() 用于将二进制字符串解析为数组,格式说明符用于解释字节。
// 解析 4 字节的无符号整数(小端序)
$binary = pack('V', 123456); // 打包
$data = unpack('Vvalue', $binary); // 解包
echo $data['value']; // 输出 123456
// 常用格式:
// 'C' = 无符号字符(1字节)
// 'S' = 无符号短整数(2字节)
// 'V' = 无符号长整数(4字节,小端)
// 'N' = 无符号长整数(4字节,大端)
// 'H' = 十六进制字符串(高半字节在前)
示例:解析二进制文件头
$hex = file_get_contents('file.bin');
// 读取前 2 字节作为状态码
$header = unpack('Cstatus/Cversion', $hex);
echo $header['status']; // 第一个字节
字节与十六进制转换
- 二进制字符串转十六进制:
bin2hex() - 十六进制转二进制字符串:
hex2bin()
$binary = "Hello"; $hex = bin2hex($binary); // 输出 "48656c6c6f" $original = hex2bin($hex); // 恢复为 "Hello"
字节数组与网络协议(套接字)
处理网络数据包时,常需要按固定字节长度解析。
// 模拟接收 4 字节包头 + 数据
$packet = pack('n', 100) . "Data"; // 'n' = 大端 2 字节
$header = unpack('nLength', substr($packet, 0, 2));
echo $header['Length']; // 100
常见陷阱与注意事项
- 编码问题:如果你处理的字符串包含多字节字符(如 UTF-8 中文),直接使用
strlen()返回的是字节数,不是字符数,需用mb_strlen()。 - 位运算:进行字节级操作时,常用位操作符
&、、<<、>>来提取或设置字节位。// 取出一个字节的低 4 位 $byte = 0xAF; $lowNibble = $byte & 0x0F; // 15
- 大小端:不同数据格式需要指定字节序(Endianness)。
pack()/unpack()时注意格式字符。 - 性能:对于大文件(>2GB),避免使用
file_get_contents()一次性读取,应使用fopen()+fread()。
位操作扩展(扩展 PHP > 5.0)
pack() 和 unpack() 是最强大的,但也可以使用 substr() 来手工提取字节:
$binary = "\x01\x02\x03\x04"; // 提取第3个字节 $byte = ord(substr($binary, 2, 1)); // 3
常用字节处理速查表
| 操作 | 函数/方法 |
|---|---|
| 数字转字节 | chr($int) / pack('C', $int) |
| 字节转数字 | ord($char) / unpack('C', $data) |
| 长字节转换 | pack('V', $int) / unpack('V') |
| 二进制转十六进制 | bin2hex($data) |
| 十六进制转二进制 | hex2bin($hex) |
| 读取文件 | fread($fp, $length) |
| 字符串截取 | substr($str, $start, $length) |
掌握这些函数,你就可以在 PHP 中游刃有余地处理二进制协议、文件格式解析和底层网络数据了。