Saya mencari cara untuk mengkonversi string panjang (dari dump), yang mewakili nilai hex menjadi array byte.
Saya tidak bisa mengutarakannya lebih baik daripada orang yang memposting pertanyaan yang sama di sini .
Tetapi untuk tetap asli, saya akan mengucapkannya dengan cara saya sendiri: seandainya saya memiliki string "00A0BF"
yang ingin saya tafsirkan sebagai
byte[] {0x00,0xA0,0xBf}
apa yang harus saya lakukan?
Saya seorang pemula Java dan akhirnya menggunakan BigInteger
dan mengawasi untuk memimpin nol nol. Tapi saya pikir itu jelek dan saya yakin saya kehilangan sesuatu yang sederhana.
BigInteger
sini .String.getBytes()
tidak akan berfungsi seperti yang Anda pikirkan. Harus belajar ini dengan cara yang sulit.if ("FF".getBytes() != "ff".getBytes()) { System.out.println("Try again"); }
Jawaban:
Inilah solusi yang menurut saya lebih baik daripada yang diposting sejauh ini:
Alasan mengapa ini merupakan peningkatan:
Aman dengan nol di depan (tidak seperti BigInteger) dan dengan nilai byte negatif (tidak seperti Byte.parseByte)
Tidak mengubah String menjadi
char[]
, atau membuat objek StringBuilder dan String untuk setiap byte tunggal.Tidak ada dependensi perpustakaan yang mungkin tidak tersedia
Jangan ragu untuk menambahkan pemeriksaan argumen melalui
assert
atau pengecualian jika argumen tersebut tidak diketahui aman.sumber
Satu baris:
Peringatan :
eckes
)Fabian
atas perhatiannya), tetapi Anda dapat mengambil kode sumber jika sistem Anda kekuranganjavax.xml
karena beberapa alasan. Terima kasih kepada @Bert Regelink
untuk mengekstraksi sumbernya.sumber
java.se
set root (default) sehingga akan menghasilkanClassNotFoundException
kecuali Anda tentukan--add-modules java.se.ee
javax.xml.bind.DatatypeConverter
sudah menyediakan metode untuk encoding / decoding data Base64. LihatparseBase64Binary()
danprintBase64Binary()
.DataTypeConverter
, Java SE 11 telah menghapus sepenuhnya API JAXB dan sekarang hanya disertakan dengan Java EE. Anda juga dapat menambahkannya sebagai ketergantungan Maven, seperti yang disarankan di sini: stackoverflow.com/a/43574427/7347751Kelas Hex di commons-codec harus melakukan itu untuk Anda.
http://commons.apache.org/codec/
sumber
Anda sekarang dapat menggunakan BaseEncoding di
guava
untuk mencapai hal ini.Untuk membalikkannya gunakan
sumber
Sebenarnya, saya pikir solusi BigInteger sangat bagus:
Sunting: Tidak aman untuk memimpin nol , seperti yang dicatat oleh poster.
sumber
Bagi Anda yang tertarik pada kode aktual di belakang One-liners dari FractalizeR (saya membutuhkannya karena javax.xml.bind tidak tersedia untuk Android (secara default)), ini berasal dari com.sun.xml.internal.bind. DatatypeConverterImpl.java :
sumber
Ini
HexBinaryAdapter
memberikan kemampuan untuk marshal dan unmarshal antaraString
danbyte[]
.Itu hanya contoh yang saya ketikkan ... Saya sebenarnya hanya menggunakannya apa adanya dan tidak perlu membuat metode terpisah untuk menggunakannya.
sumber
Berikut adalah metode yang benar-benar berfungsi (berdasarkan beberapa jawaban semi-benar sebelumnya):
Satu-satunya masalah yang mungkin saya lihat adalah jika string input sangat panjang; memanggil toCharArray () membuat salinan array internal string.
EDIT: Oh, dan omong-omong, byte ditandatangani di Java, jadi string input Anda dikonversi ke [0, -96, -65] alih-alih [0, 160, 191]. Tapi Anda mungkin sudah tahu itu.
sumber
Di android, jika Anda bekerja dengan hex, Anda dapat mencoba okio .
penggunaan sederhana:
dan hasilnya akan
sumber
The
BigInteger()
Metode dari java.math sangat lambat dan tidak recommandable.Integer.parseInt(HEXString, 16)
dapat menyebabkan masalah dengan beberapa karakter tanpa mengonversi ke Digit / Integer
Metode yang Bekerja dengan Baik:
Fungsi:
Bersenang-senang, Semoga Sukses
sumber
EDIT: seperti yang ditunjukkan oleh @mmyers, metode ini tidak bekerja pada input yang berisi substring yang sesuai dengan byte dengan set bit tinggi ("80" - "FF"). Penjelasannya ada di Bug ID: 6259307 Byte.parseByte tidak berfungsi seperti yang diiklankan di Dokumentasi SDK .
sumber
Untuk apa nilainya, inilah versi lain yang mendukung string panjang ganjil, tanpa menggunakan penggabungan string.
sumber
Saya selalu menggunakan metode seperti
metode ini membagi nilai hex yang dibatasi ruang tetapi tidak akan sulit untuk membuatnya membagi string pada kriteria lain seperti ke dalam pengelompokan dua karakter.
sumber
Byte
/byte
kasus: bit tertinggi ditetapkan tanpa memimpin -)Saya suka solusi Character.digit, tapi inilah cara saya menyelesaikannya
sumber
Kode yang disajikan oleh Bert Regelink tidak berfungsi. Coba yang berikut ini:
sumber
Saya menemukan Kernel Panic memiliki solusi yang paling berguna bagi saya, tetapi mengalami masalah jika string hex adalah angka ganjil. dipecahkan dengan cara ini:
Saya menambahkan sejumlah nomor hex ke array, jadi saya meneruskan referensi ke array yang saya gunakan, dan int saya perlu dikonversi dan mengembalikan posisi relatif nomor hex berikutnya. Jadi array byte terakhir memiliki [0] jumlah pasangan hex, [1 ...] pasangan hex, kemudian jumlah pasangan ...
sumber
Berdasarkan solusi pilihan, berikut ini harus sedikit lebih efisien:
Karena: konversi awal ke array arang memberikan pemeriksaan panjang di charAt
sumber
Jika Anda memiliki preferensi untuk Java 8 stream sebagai gaya pengkodean Anda maka ini dapat dicapai hanya dengan menggunakan JDK primitif.
The
, 0, s2.size()
parameter dalam fungsi kolektor concatenate dapat dihilangkan jika Anda tidak keberatan penangkapanIOException
.sumber
sumber
Solusi formal saya:
Seperti fungsi PHP hex2bin () tetapi dalam gaya Java.
Contoh:
sumber
Terlambat ke pesta, tetapi saya telah menggabungkan jawaban di atas oleh DaveL ke dalam kelas dengan tindakan sebaliknya - kalau-kalau itu membantu.
Dan kelas uji JUnit:
sumber
Saya tahu ini adalah utas yang sangat lama, tetapi masih ingin menambahkan nilai sen saya.
Jika saya benar-benar perlu kode hex string sederhana ke konverter biner, saya ingin melakukannya sebagai berikut.
sumber
Sejauh ini bukan solusi terbersih. Tapi itu bekerja untuk saya dan diformat dengan baik:
Hasil:
sumber
Saya pikir akan melakukannya untuk Anda. Saya menggabungkannya dari fungsi serupa yang mengembalikan data sebagai string:
sumber
Bagi saya ini solusinya, HEX = "FF01" lalu bagi menjadi FF (255) dan 01 (01)
sumber