2014-01-22 49 views
1

我正在读一个套接字,在所有问题都认为我们发送了错误的信息后,结果发现读取有问题。UNPACK()4字节整数PHP套接字

的理念是:

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. 

$消息丢失前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

不流通解压“C”告诉它你想解开一个单个字符?我想你想通过它“L”,无符号长。 – CmdrMoozy

+0

传递C可能不是正确的形式,但如果我var_dump($大小) – user1695981

+0

L返回布尔(假)如果你打印出'bin2hex($ size_get);',它似乎包含正确的数据?另外请注意,'unpack'返回一个数组,而不是一个单一的值。 – CmdrMoozy

回答

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; 
+0

它不执行。我不知道为什么。我需要任何特定的包吗? – user1695981

+0

你会得到什么错误信息? – CmdrMoozy

+0

使用第一部分进行验证,不会返回任何内容。使用$ nr = unpack(“Nval”,$ value); echo $ nr ['val'];返回了正确的结果。问题是我仍然无法得到想要的结果 – user1695981