Существует встроенный тип byte
в Java, и вы можете просто читать в byte[]
буферы, используя InputStream # читать (byte []) и записывать в OutputStream, используя OutputStream #write (byte [], int, int) , поэтому в этом нет проблем.
Что касается ваших сообщений - как вы правильно заметили, самый маленький бит информации, который вы получаете за один раз, - это байт, поэтому вам придется сначала разбить формат сообщения на 8-битные куски:
Предположим, ваше сообщение находится в байте [] с именем data. Я также предполагаю, что порядок байтов меньше.
Длина uint32 - 32 бита -> это четыре байта. (Будьте осторожны при разборе этого в Java, целые и длинные значения Java подписаны, вам нужно это обработать. Простой способ избежать проблем - это использовать длинные значения. Data [0] заполняет биты 31 - 24, data [1] 23 - 16, биты данных [2] 15 - 8 и биты данных [3] - 7–0. Поэтому вам необходимо сместить их соответствующим образом влево и склеить их вместе с логическим ИЛИ:
long uint32 = ((data[0]&0xFF) << 24) |
((data[1]&0xFF) << 16) |
((data[2]&0xFF) << 8) |
(data[3]&0xFF);
Далее, есть два отдельных бита. Я полагаю, вы должны проверить, включены ли они (1) или выключены (0). Для этого вы используете битовые маски и сравниваете свой байт с логическим AND.
Первый бит: (двоичная маска | 1 0 0 0 0 0 0 0 | = 128 = 0x80)
if ( (data[4] & 0x80 ) == 0x80 ) // on
Второй бит: (двоичная маска | 0 1 0 0 0 0 0 0 | = 64 = 0x40)
if ( (data[4] & 0x40 ) == 0x40 ) // on
Для составления следующего uint32 вам придется составлять байты за байтовые границы базовых данных. Например. для первого байта возьмите оставшиеся 6 бит данных [4], сдвиньте их на два влево (они будут битами 8–2 от uint32) и «добавьте» первые (старшие) два из данных [5], сдвинув их 6 бит справа (они займут оставшиеся 1 и 0 слот uint32). «Добавление» означает логически ИЛИ:
byte uint32Byte1 = (byte)( (data[4]&0xFF) << 2 | (data[5]&&0xFF) >> 6);
Построение вашего uint32 - это та же процедура, что и в первом примере. И так далее, и тому подобное.