1

phpスクリプトで遊ぼうとしているJavaサーバーがいくつかあります。

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

これが私の機能と解説です

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
4

2 に答える 2

3

unpack形式の文字列は、実際には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では、通常、式で配列アクセス表記を使用することはできません。変数で直接使用する必要があります。だからfunctioncall()[0]動作しません、あなたは必要$v = functioncall(); $v[0]です。これはphpいぼです。

于 2012-05-07T19:12:59.970 に答える
0

そのような返された配列にアクセスすることはできません。$len[0]を呼び出した後に行いますunpack()

$len = unpack("C",socket_read($socket, 1));    
echo "after " . $len[0] . $endl;
于 2012-05-07T18:32:21.323 に答える