Обработка LSB / MSB в Java - PullRequest
13 голосов
/ 02 марта 2011

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

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

value = 0x118;  

Хранение в байтах ...

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

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

Ответы [ 2 ]

26 голосов
/ 02 марта 2011

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

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.
9 голосов
/ 17 октября 2014

В современных версиях 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));
...