2016-02-22 2 views
1

Мне нужно, чтобы получить 64-разрядную мало-Endian целое как байт-массив с верхними 32 битами обнуленных и нижние 32 бит, содержащих некоторое целое число, пусть говорят, что 51.Как правильно получить мало-Endian целое число в Java

Теперь я делаю это следующим образом:

byte[] header = ByteBuffer 
      .allocate(8) 
      .order(ByteOrder.LITTLE_ENDIAN) 
      .putInt(51) 
      .array(); 

Но я не уверен, что это правильный путь. Правильно ли я это делаю?

+2

Почему вы ожидаете, что 64 бита в int? «Int» - 32 бита. Кроме того, 'ByteBuffer.allocate' занимает несколько _bytes_, а не число _bits_, поэтому ваш' ByteBuffer' имеет шестьдесят нулей _bytes_ в конце. –

+0

Я просто процитировал то, что у меня есть в описании API. В нем сказано: «64-битное мало-конечное целое число, верхние 32 бита зарезервированы для флагов (обнуление), более низкие 32 бита представляют размер предстоящих данных». И, спасибо, это действительно моя ошибка, чтобы выделить 64 байта вместо бит. – udenfox

+0

Возможно, вы захотите использовать длинный, если хотите представить 32 бита с указанием положительного числа, такого как размер (конечно, вы можете указать все возможные размеры, используя также 31 бит). –

ответ

2

Что о попытке следующее:

private static byte[] encodeHeader(long size) { 
    if (size < 0 || size >= (1L << Integer.SIZE)) { 
     throw new IllegalArgumentException("size negative or larger than 32 bits: " + size); 
    } 

    byte[] header = ByteBuffer 
      .allocate(Long.BYTES) 
      .order(ByteOrder.LITTLE_ENDIAN) 
      .putInt((int) size) 
      .array(); 
    return header; 
} 

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

Я пренебрегаю флагами здесь, вы можете передать их отдельно. Я изменил ответ так, что положение буфера помещено в конец размера.

 Смежные вопросы

  • Нет связанных вопросов^_^