我有一个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
答案 0 :(得分:3)
解压缩格式字符串实际上类似于code [repeater] [name]
,由正斜杠分隔。例如,Clength
。输出数组将按名称进行关联和键控,重复的字段后缀为数字后缀,从1开始。 C2length
的输出键将为length1
和length2
。
文档对此并不十分清楚。
因此,当您未指定任何名称时,它只会附加数字后缀,从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;