Разделите 32-битное целое число на 4 8-битных целых числа - PullRequest
0 голосов
/ 19 мая 2019

Я работаю с видеоданными на Java и хочу хранить четыре 8-битных целых числа в 32-битном целом числе.Другими словами, я хотел бы упаковать значения R, G, B и A в диапазоне от 0 до 255 в одно 32-битное целое число.

Как мне поступить:

  1. Создание 4 целочисленных значений от 0 до 255 и сохранение их в 32-битном целом?

  2. Распаковка 4-битных целочисленных значений из 32-битного целого?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 19 мая 2019

Упаковка:

int rgba = (a << 24) | (b << 16) | (g << 8) | r;

<< - оператор левого смещения;| является побитовым или оператором.

Распаковка:

int r = rgba & 0xff;
int g = (rgba >> 8) & 0xff;
int b = (rgba >> 16) & 0xff;
int a = (rgba >> 24) & 0xff;

>> - (смещенный *) оператор смещения вправо;& является побитовым и оператором.

Очевидно, вы можете упаковать / распаковать их в любом порядке.


(*) Вы можете использовать как подписанный, так и неподписанный (>>>) сдвиг вправо здесь.В этом случае не имеет значения результат.

0 голосов
/ 19 мая 2019

Вы можете использовать следующие утилиты на основе ByteBuffer:

    int transformToInt(byte[] array) {
        return ByteBuffer.wrap(array).order(ByteOrder.BIG_ENDIAN).getInt();
    }

    byte[] transformToBytes(int value) {
        return ByteBuffer.allocate(4).putInt(value).array();
    }
0 голосов
/ 19 мая 2019

Это просто. Используйте класс Color.

  1. Создание 4 целочисленных значений от 0 до 255 и сохранение их в 32-битном целом числе?

Используйте конструктор Color(int, int, int, int) и метод getRGB.

  1. Распаковка 4-битных значений Integer из 32-битного Integer?

Используйте конструктор Color(int) и методы getRed, getGreen, getBlue и getAlpha.

Ссылка: Документация java.awt.Color класса

...