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 位带符号整数的整数大小。

整数范围之外的任何值都将转换为浮点数。