我正在阅读一个套接字,在所有问题都认为我们发送了错误的信息之后,事实证明阅读时出现了问题。
这个想法是:
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;
}
答案 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;