Инициализация 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());
}

person user2121    schedule 02.11.2014    source источник


Ответы (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
person Boann    schedule 02.11.2014
comment
спасибо за ответ, но, пожалуйста, дайте мне знать, почему используется правый сдвиг, за которым следует операция And над 0xFF - person user2121; 02.11.2014
comment
length >> 8 записывает старший байт, сдвигая число вниз на 8 бит, так что биты с позиций с 8 по 15 теперь занимают позиции битов с 0 по 7. Биты, которые были на позициях с 0 по 7, удаляются. (Для положительных чисел это эквивалентно делению числа на 2 в 8-й степени, т. е. 256.) Для байта меньшей длины биты с 0 по 7 уже находятся в желаемой позиции, но нам нужно отключить другие биты. числа, которое выполняется с помощью И с 0xFF, что является числом, имеющим только биты от 0 до 7. - person Boann; 02.11.2014
comment
благодарю вас. у меня был еще один вопрос, связанный с той же темой, пожалуйста, посмотрите, если вы не возражаете stackoverflow.com/questions/26689636/ - person user2121; 02.11.2014