2011-01-25 3 views
0

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

Функция Я использую это:

public static int foldInByte(int m, int pos, byte b) { 
    int tempInt = (b << (pos * 8)); 
    tempInt = tempInt & (0x000000ff << (pos * 8)); 
    m = m | tempInt; 
    return m; 
} 

А код, реализующий это:

byte[] bitMaskArray = new byte[]{ 
          byteBuffer.get(inputIndex), 
          byteBuffer.get(inputIndex + 1), 
          byteBuffer.get(inputIndex + 2), 
          byteBuffer.get(inputIndex + 3)}; 
         int tempInt = 0; 

         tempInt = foldInByte(0, 3, bitMaskArray[3]); 
         tempInt = foldInByte(tempInt, 2, bitMaskArray[2]); 
         tempInt = foldInByte(tempInt, 1, bitMaskArray[1]); 
         tempInt = foldInByte(tempInt, 0, bitMaskArray[0]); 

         bitMask = tempInt; 

Байты считываются из ByteBuffer с порядком байтов будучи Little Endian.

Например, байты 00 01 B6 02 устанавливают битMask на: 2B60100 - который отлично работает в моей программе.

Однако, если байты A0 01 30 00, битмаск установлен в значение: 3001A0 - который зацепил последний ноль из битовой маски.

Есть ли способ, которым я могу остановить Java от обрезки задних нулей?

Надеюсь, это имеет смысл.

Благодаря

Tony

+0

Что вы подразумеваете под словом? В первом случае один ноль также «отключен» (2B60100 вместо 02B60100), но, по правде говоря, в обоих случаях ведущие (незначительные) нули просто не печатаются при выводе маски. Внутренне это все равно 32-битное целое со всеми ведущими нулями. Или я полностью не понимаю ваш вопрос? Кстати, какова точка второй строки в foldInByte()? –

+0

Если я жестоко честен, я не понимаю, как работает эта функция. Я пытаюсь переставить байты на Java, чтобы они читали определенный путь как unsigned int, и мне сказали, что это один из способов сделать это. Когда я говорю «зачищающие нули», я имею в виду, что в конце числа, которое мне нужно, когда я использую его как бинарный битмаск/бит-массив, нет нуля. – Tony

ответ

3

Нули не раздели - оба приведенные примеры являются правильными.

  • 00 01 B6 02 является 4-байтовый прямой порядок байтов для 2B60100
  • A0 01 30 00 является 4-байтовый прямой порядок байтов для 3001A0

Нули есть, но, вероятно, просто не печатается. Семейство вызовов System.out.print не будет печатать ведущие нулевые цифры.

Я мог бы упомянуть, что ваш метод излишне сложный. Вот один метод, который вычисляет то же значение:

static int extractLittleEndian4(byte[] buf, int index) 
{ 
    int a = buf[index+0]&0xff, b = buf[index+1]&0xff, c = buf[index+2]&0xff, d = buf[index+3]&0xff; 
    return a | (b << 8) | (c << 16) | (d << 24); 
} 
+2

Я просто делал 'byteBuffer.order (ByteBuffer .LITTLE_ENDIAN); int mask = byteBuffer.getInt(); ' –

+0

Отличная точка, Сергей. –

0

Похоже, у вас есть ByteBuffer заполнены с байтами уже. Почему бы вам не позволить ByteBuffer отменить байты для вас? Просто добавьте байты в буфер (BIG_ENDIAN является значением по умолчанию, если вы хотите добавить целое число вместо байтов), а затем измените порядок перед чтением целого числа.

byteBuffer.order(ByteOrder.LITTLE_ENDIAN); 
int output = byteBuffer.getInt(0); 

Если все, что вы делаете, это изменение порядка байтов, позвольте библиотеке выполнить работу за вас. Если вы столкнулись с целым значением, вы можете просто сделать это:

int input = ...; 
int output = Integer.reverseBytes(input);