PHP中的字节缓冲区?

时间:2015-04-07 06:49:27

标签: php node.js byte buffer bytebuffer

我正在使用一个使用自定义TCP协议的项目。我有一切都在线,除了一件事:协议在消息之前需要4个咬,这决定了包的长度。在NodeJS中,这可以通过以下方式完成:

var b = new Buffer(4);
b.writeUInt32BE(data.length, 0);

但PHP也有这样的方式吗?我正在考虑使用pack() - 但我没有使用此功能的经验。我还需要读取相同格式的包,所以我也需要能够从前4个中获取整数。

1 个答案:

答案 0 :(得分:2)

使用pack是使用PHP的正确方法,以下是如何使用它来返回所需信息的示例:

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

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