Подтвердить что ты не робот

Как разделить целое число на 2 байтовых двоичных файла?

Учитывая

private int width = 400;
private byte [] data = new byte [2];  

Я хочу разбить целочисленную "ширину" на два байта и загрузить данные [0] с высоким байтом и данными [1] с младшим байтом.

Это двоичное значение 400 = 1 1001 0000 поэтому данные [0] должны содержать 0000 0001 и данные [1] должны содержать 1001 0000

4b9b3361

Ответ 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;