Бесплатный вебинар
«как найти любимую работу»
Подарки на 150 000 ₽ за участие
Живой эфир
Записи не будет!
00:00:00:00
дн.ч.мин.сек.

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

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

Для того чтобы преобразовать целочисленное значение в массив байтов в 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));
}

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

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Библиотека 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
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой класс в Java используется для преобразования целочисленного значения в массив байтов?
1 / 5
Свежие материалы