Преобразование long в byte[] и обратно в Java

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

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

Воспользуйтесь классом ByteBuffer для преобразования Long в byte[]:

Java
Скопировать код
byte[] bytes = ByteBuffer.allocate(Long.BYTES).putLong(12345L).array();

Для возвращения к Long из byte[] примените следующий код:

Java
Скопировать код
Long restored = ByteBuffer.wrap(bytes).getLong();

Приведенные методы ByteBuffer позволяют корректно выполнять преобразование, делая код более понятным.

Погружение в порядок байтов

Порядок байтов играет важную роль при конвертации между массивами байтов и числовыми типами. Этот порядок определяет последовательность расположения байтов в памяти. В Java вы можете настроить порядок байтов, используя метод order() класса ByteBuffer:

Java
Скопировать код
ByteBuffer byteBuffer = ByteBuffer.allocate(Long.BYTES);
byteBuffer.order(ByteOrder.BIG_ENDIAN);
byteBuffer.putLong(12345L);
byte[] bytes = byteBuffer.array();

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

Нетривиальное решение: ручное преобразование

Если вам кажется, что ByteBuffer слишком сложен, можно воспользоваться ручным преобразованием:

Java
Скопировать код
public static byte[] longToBytes(long l) {
    byte[] result = new byte[8];
    for (int i = 7; i >= 0; i--) {
        result[i] = (byte)(l & 0xFF);
        l >>= Byte.SIZE;
    }
    return result;
}

public static long bytesToLong(byte[] b) {
    long result = 0;
    for (int i = 0; i < 8; i++) {
        result <<= Byte.SIZE;
        result |= (b[i] & 0xFF);
    }
    return result;
}

Этот подход позволяет экономить ресурсы, особенно, когда требуется контролировать каждый байт.

Приключение через потоки данных

Работаете с сетью или IO-потоками? Используйте DataOutputStream и DataInputStream:

Java
Скопировать код
DataOutputStream dos = new DataOutputStream(new ByteArrayOutputStream());
dos.writeLong(12345L);

DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes));
Long value = dis.readLong();

Такие потоки значительно упрощают работу с массивами байтов.

Воспользоваться библиотекой: Когда уже чувствуешь себя в джунглях

Иногда, для упрощения работы могут пригодиться библиотеки, такие как Guava:

Java
Скопировать код
byte[] bytes = Longs.toByteArray(12345L);

Вариант подойдет для тех, кто ценит простоту и читаемость кода, не заботясь о дополнительных ресурсах, потребляемых библиотекой.

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

Представьте процесс преобразования вашего значения Long в виде путешествия из «страны Integer» в «байтовый город»:

Путевка в byte[]:

Long (🚂) отправляется из страны Integer
🚂 ➡️ 🚃🚃🚃🚃🚃🚃🚃🚃 (Каждый вагон — байт)

Обратный путь к Long:

🚃🚃🚃🚃🚃🚃🚃🚃 ➡️ 🚂 (Возвращение на Родину)

Соревнование в производительности: Кто первым дойдет до финиша?!

Кто оказывается быстрее – ByteBuffer, ручные битовые операции или библиотеки вроде Guava?

Java
Скопировать код
// Готовы? На старт!

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

Обеспечение безопасности данных

Целостность данных – приоритетный аспект. Корректная работа с порядковым номером байтов и внимание к деталям помогут избежать ошибок:

Java
Скопировать код
// Добавьте unit-тесты и спите спокойно.

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

  1. Примитивные типы данных (Учебное пособие Java™ > Изучение языка Java > Основы языка) — руководство по примитивным типам данных Java.
  2. ByteBuffer (Java SE 7 Platform) — всё, что нужно знать о ByteBuffer.
  3. [type conversion – How do I convert Long to byte[] and back in java – Stack Overflow](https://stackoverflow.com/questions/4485128/how-do-i-convert-long-to-byte-and-back-in-java) — сборник практических советов от профессионалов.
  4. Arrays (Учебное пособие Java™ > Изучение языка Java > Основы языка) — базовые знания по работе с массивами.
  5. BigInteger (Java SE 7 Platform) — советы по работе с большими числами.
  6. Порядок байтов – Wikipedia — всё о порядке байтов.