Читать один байт как неподписанный байт

У меня есть какой-то 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;
Другие вопросы по тегам