Как разделить целое число на двоичный байт? - PullRequest
39 голосов
/ 15 ноября 2009

С учетом

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

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

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

Ответы [ 7 ]

78 голосов
/ 15 ноября 2009

Использование простых побитовых операций:

data[0] = (byte) (width & 0xFF);
data[1] = (byte) ((width >> 8) & 0xFF);

Как это работает:

  • & 0xFF маскирует все, кроме младших восьми бит.
  • >> 8 отбрасывает младшие 8 бит, перемещая все биты на 8 позиций вправо.
  • Приведение к байту необходимо, потому что эти побитовые операции работают с int и возвращают int, который является большим типом данных, чем byte. Случай безопасен, поскольку все ненулевые биты поместятся в byte. Для получения дополнительной информации см. Конверсии и рекламные акции .

Редактировать: Тейлор L правильно отмечает, что, хотя >> работает в этом случае, он может дать неверные результаты, если вы обобщите этот код до четырех байтов (поскольку в Java int составляет 32 бита). В этом случае лучше использовать >>> вместо >>. Для получения дополнительной информации см. Учебник по Java по Операции побитового и битового сдвига .

11 голосов
/ 15 ноября 2009

Для преобразования двух байтов самое чистое решение -

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

Неважно, используется ли >> или >>> для сдвига, любые биты, созданные расширением знака, не будут заканчиваться полученными байтами.

См. Также этот ответ .

4 голосов
/ 15 ноября 2009

Это должно делать то, что вы хотите для 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;
}
1 голос
/ 15 ноября 2009

Целое число составляет 32 бита (= 4 байта) в Java, вы знаете?

width & 0xff даст вам первый байт, width & 0xff00 >> 8 даст вам второе и т. д.

0 голосов
/ 15 ноября 2009

Я предлагаю вам взглянуть на источник для HeapByteBuffer. Он имеет код преобразования для всех примитивных типов данных. (На самом деле вы можете просто использовать ByteBuffer;)

0 голосов
/ 15 ноября 2009
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);
    }
}
0 голосов
/ 15 ноября 2009

Чтобы получить старший байт, сдвиньте вправо на 8 бит, а затем замаскируйте верхние байты. Аналогично, чтобы получить младший байт, просто замаскируйте верхние байты.

data[0] = (width >> 8) & 0xff;
data[1] = width & 0xff;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...