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, где 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);