Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Инициализация ByteArrayOutputStream?

Автор вопроса: user2121Ответов: 1

Я новичок в MQTT и Android Open Accessory "AOA". читая учебник, я понял, что перед любой попыткой записи в переменную типа ByteArrayOutputStream, однако, сначала в эту переменную следует записать 0 или 0x00.

Это какая-то инициализация? Ниже приведен пример этого:

EX_1

variableHeader.write(0x00);
variableHeader.write(PROTOCOL_NAME.getBytes("UTF-8").length);
variableHeader.write(PROTOCOL_NAME.getBytes("UTF-8"));

EX_2

public static byte[] connect() throws UnsupportedEncodingException, IOException {
   String identifier = "android";
   ByteArrayOutputStream payload = new ByteArrayOutputStream();
   payload.write(0);
   payload.write(identifier.length());
}

javamqttbytearraybytearrayoutputstreamandroid-open-accessory

Ответы

Ответ 1 · рейтинг 2 · Boann

Это не какая-либо инициализация, необходимая ByteArrayOutputStream. Вызов write(0) просто вставляет 0-байт в качестве первого байта в массиве байтов.

Вместо этого байт должен иметь значение для протокола MQTT. Я не знаком с этим, но краткий обзор спецификация протокола MQTT показывает, что строки кодируются путем записи байтов строки в UTF-8 с префиксом 2-байтового поля длины, старшим байтом вперед.

В обоих приведенных вами примерах строки записываются, но записывается только один байт длины. Таким образом, байт 0 должен быть байтом другой длины. Я уверен, что это так. Код немного неаккуратный: он предполагает, что строки в вашем случае имеют длину менее 256 байт, поэтому всегда можно предположить, что верхний байт длины равен 0.

Если есть вероятность того, что "имя протокола" будет 256 байтов или больше, то правильный способ написать этот код:

variableHeader.write(0x00);
variableHeader.write(PROTOCOL_NAME.getBytes("UTF-8").length);
variableHeader.write(PROTOCOL_NAME.getBytes("UTF-8"));

было бы:

byte[] stringBytes = PROTOCOL_NAME.getBytes("UTF-8");
variableHeader.write(stringBytes.length >> 8); // upper length byte
variableHeader.write(stringBytes.length & 0xFF); // lower length byte
variableHeader.write(stringBytes); // actual data

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы