php - PHP 中的字节缓冲区?

标签 php node.js byte buffer bytebuffer

我正在处理一个使用自定义 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/

相关文章:

php - 我可以免受 SQL 注入(inject)攻击吗?

node.js - Node.js内存泄漏

node.js - 是否可以在项目之间共享一个 node_modules 目录

language-agnostic - 选择最不可能出现在真实数据中的魔术字节

php - 根据数组值选择行

javascript - 调整 youtube 视频的大小(在页面上和点击)

java - 如何 `read byte`在Objective-C和Java之间读取对象?

arrays - 在 vb.net 中异或字节数组的最有效方法

PhpUnit 测试 stub 方法多次返回

node.js - 通过React.js中的网站控制树莓派?