Читать один байт как неподписанный байт
У меня есть какой-то 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
2 ответа
Распакованная строка формата на самом деле 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 бородавка.
Вы не можете получить доступ к возвращенному массиву, как это. Ты бы сделал $len[0]
после звонка unpack()
,
$len = unpack("C",socket_read($socket, 1));
echo "after " . $len[0] . $endl;