2012-05-07 15 views
1

私はPHPスクリプトで遊べるようにしようとしているJavaサーバーをいくつか持っています。1バイトを符号なしバイトとして読み取る

この形式は、メッセージが符号なしバイトとして取得するバイト数と、文字列を構成するバイト数を示します。ここ

が解説

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; 
} 

と私の関数の私は、Javaの男のより、実際にPHPの男ではないので、私は、私は、この長さを取得するに取り掛かる必要があるかどうかはわかりません。

は、@ c0le2の要求で、私はあなたがそのような返される配列にアクセスすることはできません、次のエラー

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

を与え、次の編集

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

を作りました。 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

関連する問題