UNPACK()4个字节到整数PHP套接字

时间:2014-01-22 19:34:23

标签: php sockets

我正在阅读一个套接字,在所有问题都认为我们发送了错误的信息之后,事实证明阅读时出现了问题。

这个想法是:

1a- Get 4 bytes, unpack (95).
2a- Get 95 next bytes.
1b- Get 4 bytes, unpack (80).
2b- Get 80 next bytes.

我要么打开包装错误,要么正在发生一些事情。我得到的输出是:

1a- get 4 bytes, unpacked=0.
2a- get 0 next bytes. (no return)
1b- get 4 bytes, unpacked=95.
2b- get 95 bytes, get $message.

$ message缺少前2个字节,所以我认为它最后增加2个,取4个字节,这应该是下一个重复。我认为问题是0字节,或解包是错误的。

while (!feof($connect)) {
        $i='';
        $size_get=fgets($fconnect, 4);
        $size=unpack('C',$size_get);
        echo fgets($connect, $size[1]) . PHP_EOL;
    }

1 个答案:

答案 0 :(得分:1)

你遇到的问题是你读了4个字节($size_get=fgets($fconnect, 4);),但是你告诉unpack你试图用'C'格式解压缩一个字符。可以在pack的文档中找到不同的格式。

考虑到这一点,这是一个将字符串转换为32位无符号整数的完整示例:

<?php
$value = "\x12\x34\xAB\xCD";
echo "Value is: " . unpack("Nval", $value)['val'] . "\n";
?>

您可以验证此操作是否正确执行,并在此小提琴中输出您期望的值(305441741):http://ideone.com/PzbvXk

对于您的特定问题,您可以将代码更改为:

$size = unpack("Nval", $size_get)['val'];
echo fgets($connect, $size) . PHP_EOL;