Php 将单字节作为无符号字节读取
我有一些java服务器,我正在尝试使用php脚本 格式提供消息将作为无符号字节的字节数,然后提供组成字符串的字节数 这是我的评论功能Php 将单字节作为无符号字节读取,php,sockets,php-socket,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];
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 Notice: Undefined offset: 0 in simple_connect.php on line 81
您无法访问这样返回的数组。调用
unpack()
后,您将执行$len[0]
解包格式字符串实际上类似于
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漏洞。它给出了“第81行simple_connect.php中未定义的偏移量:0”。我将进行编辑,以显示我的确切代码。它发生在$len赋值中。@corsiKa:Do aprint\r($len)
,它将显示密钥是什么(可能是[1])+1,但由于5.4,您实际上可以使用诸如f()[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, );