本文目录导读:

- 基础:字符串与字节的关系
- 核心函数:
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 中游刃有余地处理二进制协议、文件格式解析和底层网络数据了。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播