Вопрос

Я пытаюсь перевернуть некоторые байты в 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, где byteOrder имеет значение Little Endian.

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

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

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

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

Спасибо

Тони

Это было полезно?

Решение

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

  • 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);
}

Другие советы

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

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

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

int input = ...;
int output = Integer.reverseBytes(input);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top