Hex:[0A][52][08][01][01][01][00][CD][21][02][59]


0      [0A]
1      [52]         Packettype    = TEMP_HUM
2      [08]         subtype       = TH8 - 
3      [01]         Sequence nbr  = 1
4/5    [01][01]     ID            = 257
6/7    [00][CD]     Temperature   = 20.5 °C
8      [21]         Humidity      = 33
9      [02]         Status        = Dry
10     [5] *nibble           Signal level  = 5
11     [9] *nibble           Battery       = OK

Таким образом, я получаю 11 байт (шестнадцатеричный) через последовательный порт. Я назначил все байты байтовому массиву, чтобы использовать их позже.

У меня два вопроса:

1] Как я могу объединить 4 и 5 байтов обратно вместе в Java (я предполагаю в INT)? 2] Как вы можете извлечь 10 и 11 или старший и младший полубайты последнего байта?

[ИЗ КОММЕНТАРИЙ НИЖЕ] Пример байта: старший [0101] [0110] Младший lowNibble = yourbyte & 0x0f; 01010110 и 0x0f (00001111) = 00000110

           highNibble = yourByte >>>> 4
           01010110 >>> 4 = 00000101


          IF you use this Example Byte: High[1101][0110]Low
          highNibble = yourByte >>> 4
          11010110 >>> 4 = 00000101
          Because >>> removes the signed bit.
1
DevilCode 3 Фев 2013 в 00:30
На самом деле я знаю только, как превратить подписанный байт в беззнаковый байт int anUnsignedByte = (int) b & 0xff; Но я действительно не знаю, что происходит.
 – 
DevilCode
3 Фев 2013 в 00:33
Да. Обратите внимание, что это >>>, а не >>>>
 – 
Eduardo
3 Фев 2013 в 01:26

1 ответ

Лучший ответ

1) Это зависит от порядка байтов. Это будет либо (b[4] << 8) | b[5], либо (b[5] << 8) | b[4]

2) lowNibble = yourByte & 0x0f; highNibble = (yourByte >> 4) & 0x0f;

Вы также можете: lowNibble = yourByte & 0x0f; highNibble = yourByte >>> 4;

Беззнаковый сдвиг (>>>) заполняет старшие биты нулями, независимо от знака.

6
Eduardo 3 Фев 2013 в 01:02
Byte = 11111111, выполнив & 0x0F, вы получите 00001111 Byte = 11111111, выполнив >> 4, вы получите 11110000, тогда что делает 0x0f? Извините за то, что был скучным, просто еще не понял это ясно.
 – 
DevilCode
3 Фев 2013 в 00:44
Выполнив 11111111 >> 4, вы получите 10001111 из-за знака. Anding с 0x0f избавляется от того, что вызвано знаком. Обратите внимание, что 01111111 >> 4 = 00000111, потому что бит знака не был установлен.
 – 
Eduardo
3 Фев 2013 в 00:56
Байт: старший [0101] [0110] Младший lowNibble = ваш байт & 0x0f; 01010110 & 0x0f (00001111) = 00000110 highNibble = yourByte >>>> 4 01010110 >>> 4 = 00000101 IF Byte: High [1101] [0110] Low highNibble = yourByte >>> 4 11010110 >>> 4 = 00000101 Потому что> >> удаляет бит со знаком.
 – 
DevilCode
3 Фев 2013 в 01:20
Я не понимаю вопрос в вашем последнем комментарии
 – 
Eduardo
3 Фев 2013 в 01:22
Это был просто пример для проверки, я все понял правильно, я поставлю вопрос, так как форматирование жесткое в комментариях
 – 
DevilCode
3 Фев 2013 в 01:23