Java убирает нули из функции - PullRequest
0 голосов
/ 25 января 2011

Я пытаюсь перевернуть несколько байтов в 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 устанавливают битовую маску на: 2B60100 - что прекрасно работает в моей программе.

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

Можно ли как-нибудь помешать Java сбросить конечные нули?

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

Спасибо

Tony

Ответы [ 2 ]

3 голосов
/ 25 января 2011

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

  • 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);
}
0 голосов
/ 25 января 2011

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

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