Как я могу преобразовать long
в byte[]
и обратно в Java?
Я пытаюсь преобразовать long
в byte[]
так, чтобы я смог отправить byte[]
через TCP-соединение. С другой стороны, я хочу взять это byte[]
и преобразовать обратно в double
.
java
type-conversion
byte
long-integer
Emre801
источник
источник
Ответы:
Или обернутый в класс, чтобы избежать повторного создания ByteBuffers:
Поскольку это становится настолько популярным, я просто хочу упомянуть, что я думаю, что в большинстве случаев лучше использовать библиотеку типа Guava. И если у вас есть какое-то странное несогласие с библиотеками, вам, вероятно, следует сначала рассмотреть этот ответ для нативных Java-решений. Я думаю, что главное, на что на самом деле мой ответ заключается в том, что вам не нужно беспокоиться о самочувствии системы.
источник
Вы можете использовать методы преобразования байтов из Google Guava .
Пример:
источник
Я протестировал метод ByteBuffer против простых побитовых операций, но последний значительно быстрее.
источник
result |= b[i]
байтовое значение будет сначала преобразовано в длинное, которое подписывает расширение. Байт со значением -128 (шестнадцатеричный0x80
) превратится в длинный со значением -128 (шестнадцатеричный0xFFFF FFFF FFFF FF80
). Сначала после преобразования находятся значения или: вместе. Использование побитовых и защищает от этого сначала преобразовать байты в междунар и отрезав знаковое расширение:(byte)0x80 & 0xFF ==> (int)0xFFFF FF80 & 0xFF ==> (int) 0x80
. Почему байты подписываются в Java, для меня немного загадка, но я думаю, что это подходит для других типов.Если вы ищете быструю развернутую версию, это должно сработать, предполагая, что байтовый массив с именем "b" имеет длину 8:
байт [] -> длинный
long -> byte [] как точный аналог вышеупомянутого
источник
Зачем вам нужен байт []? почему бы просто не записать это в сокет?
Я предполагаю, что вы имеете в виду long, а не Long , последний должен учитывать нулевые значения.
источник
byte[]
просто средство для достижения этой цели.ByteBuffer
который в соответствии с документами "Первоначальный порядок байтового буфера всегда BIG_ENDIAN.Просто запишите long в DataOutputStream с базовым ByteArrayOutputStream . Из ByteArrayOutputStream вы можете получить байтовый массив через toByteArray () :
Работает для других примитивов соответственно.
Подсказка: для TCP вам не нужен байт [] вручную. Вы будете использовать сокет
socket
и его потокивместо.
источник
Вы можете использовать реализацию в org.apache.hadoop.hbase.util.Bytes http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/util/Bytes.html.
Исходный код здесь:
http://grepcode.com/file/repository.cloudera.com/content/repositories/releases/com.cloudera.hbase/hbase/0.89.20100924-28/org/apache/hadoop/hbase/util/Bytes.java# Bytes.toBytes% 28long% 29
Ищите методы toLong и toBytes.
Я полагаю, что лицензия на программное обеспечение позволяет вам брать части кода и использовать его, но, пожалуйста, проверьте это.
источник
источник
Я добавлю другой ответ, который является самым быстрым из возможных possible (да, даже больше, чем принятый ответ), НО он не будет работать для каждого отдельного случая. ОДНАКО, это будет работать для каждого мыслимого сценария:
Вы можете просто использовать String в качестве промежуточного звена. Обратите внимание, что это даст вам правильный результат, даже если кажется, что использование String может привести к неверным результатам, поскольку вы знаете, что работаете с «нормальными» строками. Это метод повышения эффективности и упрощения кода, который, в свою очередь, должен использовать некоторые допущения в отношении строк данных, с которыми он работает.
Против использования этого метода: если вы работаете с некоторыми символами ASCII, такими как эти символы, в начале таблицы ASCII, следующие строки могут не работать, но давайте посмотрим правде в глаза - вы, вероятно, никогда не будете их использовать.
Преимущество использования этого метода: Помните, что большинство людей обычно работают с некоторыми обычными строками без каких-либо необычных символов, и тогда этот метод - самый простой и быстрый способ.
от длинного к байтовому []:
от байта [] к длинному:
источник
Если вы уже используете
OutputStream
для записи в сокет, то DataOutputStream может подойти. Вот пример:Есть аналогичные методы
short
,int
,float
и т.д. Вы можете использовать DataInputStream на приемной стороне.источник
С ByteBuffer.allocate (8) .putLong (obj) .array ():
Источник:
Для многих других примеров использования ByteBuffer:
источник
Вот еще один способ перейти
byte[]
наlong
использование Java 8 или новее:Преобразование
long
может быть выражено как биты старшего и младшего разрядов двух целочисленных значений, для которых применяется побитовое ИЛИ. Обратите внимание, чтоtoUnsignedLong
это изInteger
класса, и первый вызовtoUnsignedLong
может быть излишним.Противоположное преобразование может быть также развернуто, как уже упоминали другие.
источник
Расширения Kotlin для типов Long и ByteArray:
Вы можете увидеть полный код в моей библиотеке https://github.com/ArtemBotnev/low-level-extensions
источник