2014-01-22 48 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