Bagaimana cara mengonversi a long
ke byte[]
dan kembali di Jawa?
Saya mencoba mengonversikan long
ke byte[]
sehingga saya dapat mengirim byte[]
melalui koneksi TCP. Di sisi lain saya ingin mengambil byte[]
dan mengubahnya kembali menjadi double
.
java
type-conversion
byte
long-integer
Emre801
sumber
sumber
Jawaban:
Atau terbungkus kelas untuk menghindari berulang kali membuat ByteBuffers:
Karena ini menjadi sangat populer, saya hanya ingin menyebutkan bahwa saya pikir Anda lebih baik menggunakan perpustakaan seperti Guava di sebagian besar kasus. Dan jika Anda memiliki beberapa oposisi aneh terhadap perpustakaan, Anda mungkin harus mempertimbangkan jawaban ini terlebih dahulu untuk solusi java asli. Saya pikir hal utama jawaban saya benar-benar telah berjalan untuk itu adalah bahwa Anda tidak perlu khawatir tentang ke-endian-an dari sistem sendiri.
sumber
Anda dapat menggunakan metode konversi Byte dari Google Guava .
Contoh:
sumber
Saya menguji metode ByteBuffer terhadap operasi bitwise biasa tetapi yang terakhir secara signifikan lebih cepat.
sumber
result |= b[i]
nilai byte pertama akan dikonversi menjadi panjang yang tidak menandatangani ekstensi. Byte dengan nilai -128 (hex0x80
) akan berubah menjadi panjang dengan nilai -128 (hex0xFFFF FFFF FFFF FF80
). Pertama setelah konversi adalah nilai atau: ed bersama. Menggunakan bitwise-dan melindungi terhadap ini dengan terlebih dahulu mengkonversi byte ke int dan potong ekstensi tanda:(byte)0x80 & 0xFF ==> (int)0xFFFF FF80 & 0xFF ==> (int) 0x80
. Mengapa byte ditandatangani di java adalah sedikit misteri bagi saya, tapi saya kira itu cocok dengan tipe lainnya.Jika Anda mencari versi yang belum dibuka, ini seharusnya bisa digunakan, dengan asumsi array byte bernama "b" dengan panjang 8:
byte [] -> panjang
panjang -> byte [] sebagai pasangan yang tepat untuk yang di atas
sumber
Mengapa Anda membutuhkan byte []? mengapa tidak menulis saja ke soket?
Saya berasumsi maksud Anda panjang daripada Panjang , yang terakhir perlu untuk memungkinkan nilai nol.
sumber
byte[]
hanyalah sarana untuk mencapai tujuan itu.ByteBuffer
yang menurut dokumen "Urutan awal buffer byte selalu BIG_ENDIAN.Cukup tulis panjang ke DataOutputStream dengan ByteArrayOutputStream yang mendasarinya . Dari ByteArrayOutputStream Anda bisa mendapatkan byte-array via toByteArray () :
Bekerja untuk primitif lainnya sesuai.
Petunjuk: Untuk TCP Anda tidak perlu byte [] secara manual. Anda akan menggunakan Socket
socket
dan alirannyasebagai gantinya.
sumber
Anda dapat menggunakan implementasinya di org.apache.hadoop.hbase.util.Bytes http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/util/Bytes.html
Kode sumber ada di sini:
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
Cari metode toLong dan toBytes.
Saya percaya lisensi perangkat lunak memungkinkan Anda untuk mengambil bagian dari kode dan menggunakannya tetapi tolong verifikasi itu.
sumber
sumber
Saya akan menambahkan jawaban lain yang merupakan jawaban tercepat ׂ (ya, bahkan lebih dari jawaban yang diterima), TETAPI itu tidak akan berfungsi untuk setiap kasus. NAMUN, itu AKAN bekerja untuk setiap skenario yang mungkin:
Anda cukup menggunakan String sebagai perantara. Catatan, ini AKAN MEMBERIKAN hasil yang benar meskipun sepertinya menggunakan String mungkin menghasilkan hasil yang salah SEBAGAI PANJANG ANDA TAHU ANDA BEKERJA DENGAN STRING "NORMAL". Ini adalah metode untuk meningkatkan efektivitas dan membuat kode lebih sederhana yang sebagai gantinya harus menggunakan beberapa asumsi pada string data yang dioperasikan.
Con menggunakan metode ini: Jika Anda bekerja dengan beberapa karakter ASCII seperti simbol-simbol ini di awal tabel ASCII, baris berikut mungkin gagal, tapi mari kita hadapi itu - Anda mungkin tidak akan pernah menggunakannya.
Pro menggunakan metode ini: Ingat bahwa kebanyakan orang biasanya bekerja dengan beberapa string normal tanpa karakter yang tidak biasa dan kemudian metode ini adalah cara termudah dan tercepat untuk dilakukan.
dari Panjang ke byte []:
dari byte [] ke Panjang:
sumber
Jika Anda sudah menggunakan a
OutputStream
untuk menulis ke soket, maka DataOutputStream mungkin cocok. Berikut ini sebuah contoh:Ada metode yang sama untuk
short
,int
,float
, dll Anda kemudian dapat menggunakan DataInputStream di sisi penerima.sumber
Dengan ByteBuffer.allocate (8) .putLong (obj) .array ():
Sumber:
Untuk banyak contoh penggunaan ByteBuffer lainnya:
sumber
Berikut cara lain untuk mengkonversi
byte[]
kelong
menggunakan Java 8 atau yang lebih baru:Konversi a
long
dapat dinyatakan sebagai bit orde tinggi dan rendah dari dua nilai integer yang dikenakan bitwise-OR. Perhatikan bahwatoUnsignedLong
ini dariInteger
kelas dan panggilan pertama ketoUnsignedLong
mungkin berlebihan.Konversi yang berlawanan dapat dibatalkan juga, seperti yang lain telah disebutkan.
sumber
Ekstensi Kotlin untuk tipe Long dan ByteArray:
Anda dapat melihat kode lengkap di perpustakaan saya https://github.com/ArtemBotnev/low-level-extensions
sumber