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

Я новичок в 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());
}

1 ответ

Решение

Это не какой-либо тип инициализации, необходимый для 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
Другие вопросы по тегам