Как разделить целое число на 2 байтовых двоичных файла?
Учитывая
private int width = 400;
private byte [] data = new byte [2];
Я хочу разбить целочисленную "ширину" на два байта и загрузить данные [0] с высоким байтом и данными [1] с младшим байтом.
Это двоичное значение 400 = 1 1001 0000
поэтому данные [0] должны содержать 0000 0001
и данные [1] должны содержать 1001 0000
Ответы
Ответ 1
Использование простых побитовых операций:
data[0] = (byte) (width & 0xFF);
data[1] = (byte) ((width >> 8) & 0xFF);
Как это работает:
-
& 0xFF
маскирует все, кроме младших восьми бит.
-
>> 8
отбрасывает самые младшие 8 бит, перемещая все биты 8 мест вправо.
- Приведение в байты необходимо, потому что эти побитовые операции работают с
int
и возвращают int
, который является более крупным типом данных, чем byte
. Случай безопасен, так как все ненулевые биты будут соответствовать byte
. Для получения дополнительной информации см. Конверсии и рекламные акции.
Изменить: Taylor L правильно отмечает, что хотя >>
работает в этом случае, он может давать неверные результаты, если вы обобщите этот код до четырех байтов (поскольку в Java an int
- 32 бита). В этом случае лучше использовать >>>
вместо >>
. Для получения дополнительной информации см. учебник по Java по операциям побитового и битового сдвигов.
Ответ 2
Для преобразования двух байтов самое чистое решение
data[0] = (byte) width;
data[1] = (byte) (width >>> 8);
Для преобразования целого числа в четыре байта код будет
data[0] = (byte) width;
data[1] = (byte) (width >>> 8);
data[2] = (byte) (width >>> 16);
data[3] = (byte) (width >>> 24);
Не имеет значения, используется ли → или → > для переключения, любые биты, созданные расширением знака, не будут попадать в результирующие байты.
См. также этот ответ.
Ответ 3
Это должно делать то, что вы хотите для 4-байтового int. Обратите внимание, что он хранит младший байт при смещении 0. Я оставлю его как упражнение для чтения, чтобы заказать их по мере необходимости.
public static byte[] intToBytes(int x) {
byte[] bytes = new byte[4];
for (int i = 0; x != 0; i++, x >>>= 8) {
bytes[i] = (byte) (x & 0xFF);
}
return bytes;
}
Ответ 4
Целое число - 32 бита (= 4 байта) в java, вы знаете?
width и 0xff даст вам первый байт,
width и 0xff00 → 8 даст вам второй и т.д.
Ответ 5
int width = 400;
byte [] data = new byte [2];
data[0] = (byte) ((width & 0xFF00) >> 8);
data[1] = (byte) (width & 0xFF);
for(int b = 0; b < 2; b++) {
System.out.println("printing byte " + b);
for(int i = 7; i >= 0; i--) {
System.out.println(data[b] & 1);
data[b] = (byte) (data[b] >> 1);
}
}
Ответ 6
Я предлагаю вам взглянуть на источник для HeapByteBuffer. Он имеет код преобразования для всех примитивных типов данных. (На самом деле вы можете просто использовать ByteBuffer;)
Ответ 7
Чтобы получить старший байт, сдвиньте налево на 8 бит, затем закройте верхние байты. Аналогично, чтобы низкий байт просто маскировал верхние байты.
data[0] = (width >> 8) & 0xff;
data[1] = width & 0xff;