Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将单字节作为无符号字节读取_Php_Sockets_Php Socket - Fatal编程技术网

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];

我有一些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 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 a
print\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, );