2012-05-07 111 views
1

我有一些java服務器,我試圖去玩一個PHP腳本。作爲一個無符號字節讀單個字節

該格式提供了消息將作爲無符號字節的字節數,然後是組成字符串的字節。

這裏是我的評論

function read($socket, $readnum) { 
    $endl = "<br>"; // It's running on apache 

    // attempt to get the byte for the size 
    $len = unpack("C",socket_read($socket, 1))[0]; 
    // this prints "after ", but $len does not print. $endl does 
    echo "after " . $len . $endl; 
    // obviously this fails because $len isn't in a valid state 
    $msg = socket_read($socket, $len); 
    // print the message for debugging? 
    echo $len . " " . $msg; 
    return $msg; 
} 

功能我不是一個真正的PHP的人,更多的是Java的傢伙,所以我不知道我應該如何去獲得這個長度。

在@ c0le2的要求,我做了如下編輯

$lenarr = unpack("C",socket_read($socket, 1)); 
$len = $lenarr[0]; // line 81 

這給了以下錯誤

PHP Notice: Undefined offset: 0 in simple_connect.php on line 81 

回答

3

解包格式字符串實際上就像code [repeater] [name],用正斜槓分隔。例如,Clength。輸出數組將按名稱進行關聯和鍵控,重複的字段具有附加的數字後綴,從1開始。 C2length的輸出鍵將是length1length2

該文檔對此不太清楚。

因此,當您不指定任何名稱時,它只會追加數字後綴,從1開始。因此,您要查找的長度爲$lenarr[1]

但你應該試試這個:

$v = unpack('Clength', "\x04"); 
var_export($v); // array('length' => 4) 

這裏有一些例子:

unpack('C2length', "\x04\x03"); 
// array ('length1' => 4, 'length2' => 3,); 

unpack('Clength/Cwidth', "\x04\x03"); 
// array ('length' => 4, 'width' => 3,); 

此外,在PHP你不能一般使用數組訪問符號上expression--你需要直接在變量上使用它。所以functioncall()[0]將無法​​正常工作,您需要$v = functioncall(); $v[0]。這是一個php疣。

+1

+1,但自5.4以來,您可以使用解除引用,例如'f()[1]' –

+0

這非常好,只給我提供瞭解決問題所需的信息。謝謝! – corsiKa

0

您無法訪問返回的數組那樣。撥打unpack()後,您會做$len[0]

$len = unpack("C",socket_read($socket, 1));  
echo "after " . $len[0] . $endl; 
+0

這給了我「第81行的simple_connect.php中的未定義偏移量:0」。我將進行編輯以顯示我的確切代碼。它發生在$ len分配上。 – corsiKa

+0

@corsiKa:做一個'print_r($ len);',它會顯示出關鍵是什麼(也許它是[1])。 – cOle2

相關問題