Обработка LSB/MSB в Java

Если мне нужно обрабатывать значения, которые должны храниться в байтах, как 0x118, как мне разделить LSB и MSB?

Я пробовал следующий путь... Я не думаю, что это правильный путь:

value = 0x118;  

Сохранение в байтах...

result[5] = (byte) value;  
result[6] = (byte)(value << 8);  
...

Каков правильный путь?

Ответ 1

Это будет сделано:

result[5] = (byte) (value & 0xFF);           // Least significant "byte"
result[6] = (byte) ((value & 0xFF00) >> 8);  // Most significant "byte"

Обычно я использую битовые маски - возможно, они не нужны. Первая строка выбирает нижние восемь бит, вторая строка выбирает верхние восемь бит и сдвигает биты на восемь бит вправо. Это равно делению на 2 8.


Это "трюк" позади:

  (I) LSB

  01010101 10101010        // Input
& 00000000 11111111        // First mask, 0x00FF
  -----------------
  00000000 10101010        // Result - now cast to byte

  (II) MSB

  01010101 10101010        // Input
& 11111111 00000000        // Second mask, 0xFF00
  -----------------
  01010101 00000000        // Result - 
  >>>>>>>>                 // "Shift" operation, eight positions to the right
  -----------------
  00000000 01010101        // Result - now cast to byte

Подводя итог, сделайте следующий расчет:

 byte msb = result[6];
 byte lsb = result[5];
 int result = (msb << 8) + lsb;    // Shift the MSB bits eight positions to the left.

Ответ 2

В сегодняшних версиях Java нет необходимости делать это вручную. И вы не должны делать это как легко вставлять ошибки.

Просто используйте:

short value = 0x118;
ByteBuffer.wrap(result).order(ByteOrder.LITTLE_ENDIAN).putShort(5, value);

для этой задачи. Класс ByteBuffer предоставляет методы для размещения всех примитивных типов данных в байтах младшего порядка или большого байта, как вы пожелаете. Он также предлагает способ поместить гетерогенную последовательность значений с использованием предполагаемой позиции:

ByteBuffer.wrap(result) // default big endian, start a offset 0
  .put(byteValue).putInt(123456).putShort(value)
  .order(ByteOrder.LITTLE_ENDIAN) // change for next values
  .putInt(400).putShort(value);

Или более эффективный способ обработки последовательности одинаковых значений:

ByteBuffer.wrap(result).order(ByteOrder.LITTLE_ENDIAN)
  .asShortBuffer().put(shortValue1).put(shortValue2).put(shortValue3);

Конечно, вы также можете прочитать значение:

System.out.printf("0x%x%n",
  ByteBuffer.wrap(result).order(ByteOrder.LITTLE_ENDIAN).getShort(5));