Преобразование long в byte[] и обратно в Java
Быстрый ответ
Воспользуйтесь классом ByteBuffer для преобразования Long в byte[]:
byte[] bytes = ByteBuffer.allocate(Long.BYTES).putLong(12345L).array();
Для возвращения к Long из byte[] примените следующий код:
Long restored = ByteBuffer.wrap(bytes).getLong();
Приведенные методы ByteBuffer позволяют корректно выполнять преобразование, делая код более понятным.
Погружение в порядок байтов
Порядок байтов играет важную роль при конвертации между массивами байтов и числовыми типами. Этот порядок определяет последовательность расположения байтов в памяти. В Java вы можете настроить порядок байтов, используя метод order()
класса ByteBuffer:
ByteBuffer byteBuffer = ByteBuffer.allocate(Long.BYTES);
byteBuffer.order(ByteOrder.BIG_ENDIAN);
byteBuffer.putLong(12345L);
byte[] bytes = byteBuffer.array();
Примечание: Для избежания ошибок при обработке данных важно строго придерживаться одного выбранного порядка байтов.
Нетривиальное решение: ручное преобразование
Если вам кажется, что ByteBuffer слишком сложен, можно воспользоваться ручным преобразованием:
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
:
DataOutputStream dos = new DataOutputStream(new ByteArrayOutputStream());
dos.writeLong(12345L);
DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes));
Long value = dis.readLong();
Такие потоки значительно упрощают работу с массивами байтов.
Воспользоваться библиотекой: Когда уже чувствуешь себя в джунглях
Иногда, для упрощения работы могут пригодиться библиотеки, такие как Guava:
byte[] bytes = Longs.toByteArray(12345L);
Вариант подойдет для тех, кто ценит простоту и читаемость кода, не заботясь о дополнительных ресурсах, потребляемых библиотекой.
Визуализация
Представьте процесс преобразования вашего значения Long в виде путешествия из «страны Integer» в «байтовый город»:
Путевка в byte[]:
Long (🚂) отправляется из страны Integer
🚂 ➡️ 🚃🚃🚃🚃🚃🚃🚃🚃 (Каждый вагон — байт)
Обратный путь к Long:
🚃🚃🚃🚃🚃🚃🚃🚃 ➡️ 🚂 (Возвращение на Родину)
Соревнование в производительности: Кто первым дойдет до финиша?!
Кто оказывается быстрее – ByteBuffer, ручные битовые операции или библиотеки вроде Guava?
// Готовы? На старт!
Найдите идеальный баланс скорости, простоты и удобства поддержки вашего кода.
Обеспечение безопасности данных
Целостность данных – приоритетный аспект. Корректная работа с порядковым номером байтов и внимание к деталям помогут избежать ошибок:
// Добавьте unit-тесты и спите спокойно.
Полезные материалы
- Примитивные типы данных (Учебное пособие Java™ > Изучение языка Java > Основы языка) — руководство по примитивным типам данных Java.
- ByteBuffer (Java SE 7 Platform) — всё, что нужно знать о ByteBuffer.
- [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) — сборник практических советов от профессионалов.
- Arrays (Учебное пособие Java™ > Изучение языка Java > Основы языка) — базовые знания по работе с массивами.
- BigInteger (Java SE 7 Platform) — советы по работе с большими числами.
- Порядок байтов – Wikipedia — всё о порядке байтов.