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
4

2 回答 2

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 中,您通常不能在表达式上使用数组访问表示法——您需要直接在变量上使用它。所以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 回答