PHP 中的字节缓冲区?
A byte buffer in PHP?
我正在处理一个使用自定义 TCP 协议的项目。我什么都准备好了,除了一件事:协议要求消息前有 4 位,这决定了包的长度。在 NodeJS 中,这是通过以下方式完成的:
var b = new Buffer(4);
b.writeUInt32BE(data.length, 0);
可是PHP也有这样的方法吗?我正在考虑使用 pack()
- 但我没有使用此功能的经验。我也需要读取一个相同格式的包,所以我也需要能够从前4位中获取整数。
使用 pack 是进入 PHP 的正确方法,这里是如何使用它来 return 您需要的信息的示例:
<?php
$string = 'hello world';
$bytes = pack ( 'N', strlen ( $string ) ); // unsigned 32 bit big endian byte order
?>
要将前 4 个原始字节解析回数字,这是假设名为 $rawBytes 的变量包含从 tcp 数据包读取的数据。
<?php
$decoded = unpack ( 'N', substr ( $rawBytes, 0, 4 ); );
$length = end ( $decoded );
?>
PHP 中的一个不幸陷阱是二进制文件只能理解 Windows 机器和 32 位 Linux/Macintosh/Unix 机器上的 32 位带符号整数。
−2,147,483,648 至 2,147,483,647
64 位 PHP 二进制文件 运行 在 Linux/Macintosh/Unix 机器上具有带符号的 64 位整数的最大整数值。
−9,223,372,036,854,775,808 至 9,223,372,036,854,775,807
但是在 Windows 机器上使用 64 位二进制文件仍然具有 32 位带符号整数的整数大小。
整数范围之外的任何值都将转换为浮点数。
我正在处理一个使用自定义 TCP 协议的项目。我什么都准备好了,除了一件事:协议要求消息前有 4 位,这决定了包的长度。在 NodeJS 中,这是通过以下方式完成的:
var b = new Buffer(4);
b.writeUInt32BE(data.length, 0);
可是PHP也有这样的方法吗?我正在考虑使用 pack()
- 但我没有使用此功能的经验。我也需要读取一个相同格式的包,所以我也需要能够从前4位中获取整数。
使用 pack 是进入 PHP 的正确方法,这里是如何使用它来 return 您需要的信息的示例:
<?php
$string = 'hello world';
$bytes = pack ( 'N', strlen ( $string ) ); // unsigned 32 bit big endian byte order
?>
要将前 4 个原始字节解析回数字,这是假设名为 $rawBytes 的变量包含从 tcp 数据包读取的数据。
<?php
$decoded = unpack ( 'N', substr ( $rawBytes, 0, 4 ); );
$length = end ( $decoded );
?>
PHP 中的一个不幸陷阱是二进制文件只能理解 Windows 机器和 32 位 Linux/Macintosh/Unix 机器上的 32 位带符号整数。
−2,147,483,648 至 2,147,483,647
64 位 PHP 二进制文件 运行 在 Linux/Macintosh/Unix 机器上具有带符号的 64 位整数的最大整数值。
−9,223,372,036,854,775,808 至 9,223,372,036,854,775,807
但是在 Windows 机器上使用 64 位二进制文件仍然具有 32 位带符号整数的整数大小。
整数范围之外的任何值都将转换为浮点数。