Jak przekonwertować a long
na a byte[]
iz powrotem w Javie?
Próbuję przekonwertować a long
na, byte[]
aby móc wysłać byte[]
połączenie TCP. Z drugiej strony chcę to wziąć byte[]
i przekształcić z powrotem w plik double
.
java
type-conversion
byte
long-integer
Emre801
źródło
źródło
Odpowiedzi:
Lub opakowane w klasę, aby uniknąć wielokrotnego tworzenia ByteBuffers:
Ponieważ staje się to tak popularne, chcę tylko wspomnieć, że myślę, że w większości przypadków lepiej jest korzystać z biblioteki takiej jak Guava. A jeśli masz jakiś dziwny sprzeciw wobec bibliotek, prawdopodobnie powinieneś najpierw rozważyć tę odpowiedź w przypadku natywnych rozwiązań Java. Myślę, że najważniejszą rzeczą, jaką naprawdę ma moja odpowiedź, jest to, że nie musisz sam martwić się o endian -ness systemu.
źródło
Możesz użyć metod konwersji bajtów z Google Guava .
Przykład:
źródło
Przetestowałem metodę ByteBuffer na zwykłych operacjach bitowych, ale ta ostatnia jest znacznie szybsza.
źródło
result |= b[i]
bajtów wartość zostanie najpierw przekonwertowana na long, co powoduje rozszerzenie znaku. Bajt o wartości -128 (szesnastkowo0x80
) zamieni się w długi o wartości -128 (szesnastkowo0xFFFF FFFF FFFF FF80
). Najpierw po przeliczeniu są wartości lub: ed razem. Korzystanie bitowe, i chroni przed tym przekształcając najpierw bajt do int i odcięcie przedłużenia rejestracji:(byte)0x80 & 0xFF ==> (int)0xFFFF FF80 & 0xFF ==> (int) 0x80
. Dlaczego bajty są podpisywane w javie jest dla mnie trochę tajemnicą, ale myślę, że pasuje do innych typów.Jeśli szukasz szybkiej wersji rozwiniętej, powinno to załatwić sprawę, zakładając tablicę bajtów o nazwie „b” o długości 8:
bajt [] -> długi
long -> byte [] jako dokładny odpowiednik powyższego
źródło
Dlaczego potrzebujesz bajtu []? dlaczego po prostu nie zapisać go do gniazda?
Zakładam, że masz na myśli raczej long niż Long , ta ostatnia musi dopuszczać wartości zerowe.
źródło
byte[]
tylko środek do tego celu.ByteBuffer
który zgodnie z dokumentacją „Początkowa kolejność bufora bajtów jest zawsze BIG_ENDIAN.Po prostu zapisz long do DataOutputStream z bazowym ByteArrayOutputStream . Z ByteArrayOutputStream można pobrać tablicę bajtów poprzez toByteArray () :
Działa odpowiednio dla innych prymitywów.
Wskazówka: w przypadku protokołu TCP bajt [] nie jest potrzebny ręcznie. Będziesz używać gniazda
socket
i jego strumienizamiast.
źródło
Możesz użyć implementacji w org.apache.hadoop.hbase.util.Bytes http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/util/Bytes.html
Kod źródłowy jest tutaj:
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
Poszukaj metod toLong i toBytes.
Uważam, że licencja na oprogramowanie pozwala na pobranie części kodu i użycie go, ale prosimy o sprawdzenie tego.
źródło
źródło
Dodam kolejną odpowiedź, która jest najszybsza z możliwych ׂ (tak, nawet więcej niż zaakceptowana odpowiedź), ALE nie zadziała w każdym przypadku. JEDNAK będzie działać w każdym możliwym scenariuszu:
Możesz po prostu użyć String jako pośredniego. Zauważ, że da to poprawny wynik, nawet jeśli wydaje się, że użycie Ciągu może dać błędne wyniki, TAK DŁUGO, JAK WIESZ, ŻE PRACUJESZ Z „NORMALNYMI” STRUNIAMI. Jest to metoda zwiększania efektywności i uproszczenia kodu, która w zamian musi wykorzystywać pewne założenia dotyczące ciągów danych, na których operuje.
Wada korzystania z tej metody: Jeśli pracujesz z niektórymi znakami ASCII, takimi jak te symbole na początku tabeli ASCII, poniższe wiersze mogą się nie powieść, ale spójrzmy prawdzie w oczy - prawdopodobnie i tak nigdy ich nie użyjesz.
Zaleta tej metody: pamiętaj, że większość ludzi zwykle pracuje z normalnymi ciągami znaków bez żadnych niezwykłych znaków, a wtedy metoda jest najprostsza i najszybsza.
od Long do Byte []:
od bajtu [] do długości:
źródło
Jeśli już używasz an
OutputStream
do zapisu w gnieździe, DataOutputStream może być dobrym rozwiązaniem. Oto przykład:Istnieją podobne metody
short
,int
,float
, itd. Następnie można użyć DataInputStream po stronie odbiorczej.źródło
Z ByteBuffer.allocate (8) .putLong (obj) .array ():
Źródło:
Wiele innych przykładów użycia ByteBuffer:
źródło
Oto inny sposób konwersji
byte[]
nalong
język Java 8 lub nowszy:Konwersja a
long
może być wyrażona jako bity najwyższego i najniższego rzędu dwóch wartości całkowitych z zastrzeżeniem bitowego OR. Zauważ, żetoUnsignedLong
jest zInteger
klasy i pierwsze wywołanietoUnsignedLong
może być zbędne.Można również rozwinąć konwersję odwrotną, o czym wspominali inni.
źródło
Rozszerzenia Kotlin dla typów Long i ByteArray:
Możesz zobaczyć pełny kod w mojej bibliotece https://github.com/ArtemBotnev/low-level-extensions
źródło