ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Преобразование целого числа в массив байтов в Java

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для того чтобы преобразовать целочисленное значение в массив байтов в Java, нам поможет класс ByteBuffer:

Java
Скопировать код
ByteBuffer.allocate(Integer.SIZE / Byte.SIZE).putInt(123456789).array();

Здесь мы выделяем ByteBuffer, достаточный для хранения четырёх байтов (размера целочисленного значения), записываем число с помощью метода putInt и извлекаем готовый массив байтов с помощью метода array().

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Рассмотрим дополнительно – альтернативные решения

Битовые сдвиги

Можно воспользоваться битовыми сдвигами и маскированием для трансформации числа в массив байт:

Java
Скопировать код
int yourInt = 123456789; // Вместо 123456789 подставьте своё число
byte[] byteArr = new byte[4];

for (int i = 0; i < 4; i++) {
    byteArr[i] = (byte) (yourInt >>> (i * 8));
}

Не забывайте правильно настраивать направление сдвигов для корректного контроля порядка байтов.

Библиотека Guava

Метод Ints.toByteArray() из библиотеки Guava позволяет элегантно решить данную задачу без дополнительных операций:

Java
Скопировать код
byte[] byteArr = Ints.toByteArray(123456789);

Такой подход упращает процесс преобразования, скрывая все сложности за собой.

Arrays.copyOf()

В сочетании с обработкой диапазонов метод Arrays.copyOf() позволяет более точно управлять содержимым и размером массива байт:

Java
Скопировать код
int yourInt = 123456789;
byte[] fullSize = ByteBuffer.allocate(8).putInt(yourInt).array();
byte[] byteArr = Arrays.copyOfRange(fullSize, 4, 8); // Берём последние четыре байта

Такой подход предоставляет большую гибкость в управлении размером и содержанием массива.

Визуализация

Можно представить преобразование из Integer в byte array, как процесс упаковки большого чемодана (Integer) в четыре маленьких коробки (byte array):

Markdown
Скопировать код
Integer (💼):  |===== 1695609641 =====|
byte array (📦📦📦📦): 
| 101 | 0 | 100 | 225 |

Каждая коробка представляет собой часть большого числа, как байты в его значении. Процесс прост:

Java
Скопировать код
int suitcase = 1695609641; // Наш Integer
byte[] boxes = new byte[4]; // Четыре байта коробок, соответствующих формату int

boxes[0] = (byte) (suitcase >> 24);
boxes[1] = (byte) (suitcase >> 16);
boxes[2] = (byte) (suitcase >> 8);
boxes[3] = (byte) suitcase;

// Integer упакован в массив байт

Детали реализации

Управление порядком байтов (endianness)

Необходимо учитывать порядок байтов. Установите ByteOrder при работе с ByteBuffer:

Java
Скопировать код
int yourInt = 123456789;
ByteBuffer buffer = ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN);
buffer.putInt(yourInt);
byte[] byteArr = buffer.array(); // Теперь байты в формате little-endian

Применение Integer.toHexString() с осторожностью

Метод Integer.toHexString() возвращает строковое представление числа, а не массив байт, так что нужно использовать его с осторожностью.

Возможности BigInteger

В случае работы с большими или нетипичными числами можно использовать класс BigInteger:

Java
Скопировать код
byte[] byteArr = new BigInteger(String.valueOf(123456789)).toByteArray();

Однако будьте готовы к возникновению лишних нулевых байтов или байтов знака. Подходите к интерпретации данных с особой внимательностью.

Подводные камни и особенности

  • Переполнение и потеря данных: Всегда проверяйте, умещаются ли числа в диапазон byte. Потеря данных может стать крайне неприятной ситуацией.
  • Неизменяемость ByteBuffer: После получения массива байт с помощью array() его нельзя изменить.
  • Порядок байтов: Различные системы используют разный порядок байт. Возможны ошибки при записи или чтении данных, если этот аспект не учтён.

Полезные материалы

  1. Примитивные типы данных (Oracle Java™ Tutorials > Learning the Java Language > Language Basics)
  2. ByteBuffer (Java Platform SE 7 )
  3. BigInteger (Java Platform SE 7 )
  4. [Эффективный Java, 3-е издание [Книга]](https://www.oreilly.com/library/view/effective-java-3rd/9780134686097/)
  5. [Java Performance: Полное руководство [Книга]](https://www.oreilly.com/library/view/java-performance-the/9781449363512/)
  6. Bit Manipulation in Java — DZone