【问题标题】:A byte buffer in PHP?PHP中的字节缓冲区?
【发布时间】:2015-04-07 06:49:26
【问题描述】:

我正在处理一个使用自定义 TCP 协议的项目。除了一件事,我已经掌握了所有内容:协议要求消息前有 4 个字节,这决定了包的长度。在 NodeJS 中,这是通过以下方式完成的:

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

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

【问题讨论】:

    标签: php node.js byte buffer bytebuffer


    【解决方案1】:

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

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

    【讨论】:

    • pack("N", int) 正是我所需要的!感谢您的回答,所有问题都已解决。 :) 也感谢大家的解释,今天学到了一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多