我正在处理一个使用自定义 TCP 协议(protocol)的项目。我已经掌握了所有内容,除了一件事:协议(protocol)要求消息前有 4 个字节,这决定了包的长度。在 NodeJS 中,这是通过以下方式完成的:
var b = new Buffer(4);
b.writeUInt32BE(data.length, 0);
但是PHP也有这样的方法吗?我正在考虑使用 pack()
- 但我没有使用此功能的经验。我还需要读取相同格式的包,因此我也需要能够从前 4 位中获取整数。
最佳答案
在 PHP 中使用 pack 是正确的方法,下面是如何使用它返回所需信息的示例:
<?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
在 Linux/Macintosh/Unix 机器上运行的 64 位 PHP 二进制文件具有带符号的 64 位整数的最大整数值。
−9,223,372,036,854,775,808 至 9,223,372,036,854,775,807
但是在 Windows 计算机上使用 64 位二进制文件仍然具有 32 位有符号整数的整数大小。
任何超出整数范围的内容都将转换为 float 。
关于php - PHP 中的字节缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29485513/