将单字节读取为无符号字节

时间:2012-05-07 18:21:56

标签: php sockets php-socket

我有一个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;
}

我不是一个真正的骗子,更像是一个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

2 个答案:

答案 0 :(得分: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 wart。

答案 1 :(得分:0)

您无法像这样访问返回的数组。致电$len[0]后,您会unpack()

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