Harap edit pertanyaan Anda untuk menunjukkan kode yang Anda miliki sejauh ini . Anda harus menyertakan setidaknya garis besar (tetapi lebih disukai contoh minimal yang dapat direproduksi ) dari kode yang bermasalah, kemudian kami dapat mencoba membantu dengan masalah spesifik tersebut. Anda juga harus membaca Cara Bertanya .
Toby Speight
Jawaban:
201
Berikut cara singkat untuk mengubahnya menjadi hex:
+1 ke sampel paling murni dari 3vilness yang pernah saya lihat: menggunakan BigInteger untuk mengonversi dari byte [] ...
Eduardo Costa
13
Suka! Tidak ada loop dan tidak ada bit-flipping. Saya ingin memberi Anda
suara positif
5
untuk memastikan 40 Karakter, Anda harus menambahkan padding nol: return String.format ("% 040x", BigInteger baru (arg.getBytes (/ * YOUR_CHARSET? * /)));
Ron
4
@Kaleb Apakah Anda tahu jika mungkin untuk mengubah String yang dihasilkan kembali? Jika ya, dapatkah Anda memberi saya beberapa petunjuk? Terima kasih!
artaxerxe
1
Anda harus menggunakan BigInteger(int,byte[])konstruktor; sebaliknya jika byte pertama negatif Anda mendapatkan BigInteger negatif.
Joni
62
Untuk memastikan bahwa hex selalu terdiri dari 40 karakter, BigInteger harus positif:
Cara ini sebenarnya yang benar. Coba byte[] data = { -1, 1 };- kode dalam jawaban ini berfungsi dengan baik, sedangkan dengan 17 suara positif gagal.
hudolejev
1
Apakah mungkin untuk mendapatkan byte dengan nilai -1dari sebuah string (seperti yang diminta dalam contoh)?
Kaleb Pederson
@KalebPederson Ya. Ini bahkan tidak terlalu sulit. . Jika pengkodean yang Anda pilih pernah menggunakan bit paling signifikan dari karakter apa pun (misalnya, seperti UTF- * do), Anda memiliki bytes negatif dalam larik Anda.
Menarik, jika Anda tidak ingin menemukan kembali kemudi.
Federico Zancan
3
@MelNicholson ada fungsi decodeHex di Hex untuk pergi ke byte []. Anda perlu menggunakannya karena tidak ada yang menjamin bahwa string HEX acak dapat diubah menjadi string dalam pengkodean Anda.
BxlSofty
18
Angka yang Anda enkode menjadi heksadesimal harus mewakili beberapa pengkodean karakter, seperti UTF-8. Jadi pertama-tama ubah String menjadi byte [] yang mewakili string dalam pengkodean itu, kemudian ubah setiap byte menjadi heksadesimal.
publicstaticString hexadecimal(String input,String charsetName)throwsUnsupportedEncodingException{if(input ==null)thrownewNullPointerException();return asHex(input.getBytes(charsetName));}privatestaticfinalchar[] HEX_CHARS ="0123456789abcdef".toCharArray();publicstaticString asHex(byte[] buf){char[] chars =newchar[2* buf.length];for(int i =0; i < buf.length;++i){
chars[2* i]= HEX_CHARS[(buf[i]&0xF0)>>>4];
chars[2* i +1]= HEX_CHARS[buf[i]&0x0F];}returnnewString(chars);}
Ini adalah solusi yang menarik dan yang menyerang inti representasi digital dari data. Bisakah Anda menjelaskan apa yang Anda lakukan, dan apa yang diwakili oleh "angka ajaib" dalam solusi Anda? Seorang pendatang baru mungkin tidak tahu apa arti operator >>>, mengapa kita menggunakan bitwise-and & bersama dengan mask 0xF0, atau mengapa array karakter berukuran [2 * buf.length].
Catatan : Ini menyebabkan sedikit masalah ekstra dengan Java 9dan yang lebih baru karena API tidak disertakan secara default. Untuk referensi, misalnya lihat masalah iniGitHub .
Bagus tapi saya akan menggunakan format("%02x")jadi format () selalu menggunakan 2 karakter. Meskipun ASCII adalah hex digit ganda yaitu A = 0x65
mike jones
8
Semua jawaban berdasarkan String.getBytes () melibatkan pengkodean string Anda sesuai dengan Charset. Anda tidak perlu mendapatkan nilai hex dari 2-byte karakter yang membentuk string Anda. Jika yang Anda inginkan sebenarnya setara dengan hex viewer, maka Anda perlu mengakses karakternya secara langsung. Inilah fungsi yang saya gunakan dalam kode saya untuk men-debug masalah Unicode:
Ini bagus jika yang Anda inginkan adalah melihat representasi internal dari karakter Java, yaitu UTF-16, representasi Unicode tertentu.
Jonathan Rosenne
5
byte[] bytes = string.getBytes(CHARSET);// you didn't say what charset you wantedBigInteger bigInt =newBigInteger(bytes);String hexString = bigInt.toString(16);// 16 is the radix
Anda dapat kembali hexStringpada titik ini, dengan peringatan bahwa karakter null terkemuka akan dihilangkan, dan hasilnya akan memiliki panjang ganjil jika byte pertama kurang dari 16. Jika Anda perlu menangani kasus tersebut, Anda dapat menambahkan beberapa kode tambahan untuk diisi dengan 0s:
Ini bukanlah solusi. Pertanyaannya adalah menanyakan bagaimana mendapatkan representasi hex dari konten String arbitrer, dan secara khusus menyediakan "testing123" sebagai contoh.
skomisa
1
Menggunakan bantuan Banyak Orang dari beberapa Utas ..
Saya tahu ini telah dijawab, tetapi saya ingin memberikan metode encode & decode lengkap untuk orang lain dalam situasi yang sama ..
Inilah metode Encoding & Decoding saya ..
// Global Charset EncodingpublicstaticCharset encodingType =StandardCharsets.UTF_8;// Text To HexpublicstaticString textToHex(String text){byte[] buf =null;
buf = text.getBytes(encodingType);char[] HEX_CHARS ="0123456789abcdef".toCharArray();char[] chars =newchar[2* buf.length];for(int i =0; i < buf.length;++i){
chars[2* i]= HEX_CHARS[(buf[i]&0xF0)>>>4];
chars[2* i +1]= HEX_CHARS[buf[i]&0x0F];}returnnewString(chars);}// Hex To TextpublicstaticString hexToText(String hex){int l = hex.length();byte[] data =newbyte[l /2];for(int i =0; i < l; i +=2){
data[i /2]=(byte)((Character.digit(hex.charAt(i),16)<<4)+Character.digit(hex.charAt(i +1),16));}String st =newString(data, encodingType);return st;}
Berikut adalah beberapa tolok ukur yang membandingkan pendekatan dan pustaka yang berbeda. Guava mengalahkan Apache Commons Codec saat mendekode. Commons Codec mengalahkan Jambu dalam pengkodean. Dan JHex mengalahkan keduanya untuk decoding dan encoding.
Semuanya ada dalam satu file kelas untuk JHex . Jangan ragu untuk menyalin dan menempel jika Anda tidak menginginkan pustaka lain di pohon ketergantungan Anda. Perhatikan juga, ini hanya tersedia sebagai jar Java 9 sampai saya dapat mengetahui cara mempublikasikan beberapa target rilis dengan Gradle dan plugin Bintray.
Cara singkat dan mudah untuk mengonversi String menjadi notasi Heksadesimalnya adalah:
publicstaticvoid main(String... args){String str ="Hello! This is test string.";char ch[]= str.toCharArray();StringBuilder sb =newStringBuilder();for(int i =0; i < ch.length; i++){
sb.append(Integer.toHexString((int) ch[i]));}System.out.println(sb.toString());}
Jawaban:
Berikut cara singkat untuk mengubahnya menjadi hex:
sumber
BigInteger(int,byte[])
konstruktor; sebaliknya jika byte pertama negatif Anda mendapatkan BigInteger negatif.Untuk memastikan bahwa hex selalu terdiri dari 40 karakter, BigInteger harus positif:
sumber
byte[] data = { -1, 1 };
- kode dalam jawaban ini berfungsi dengan baik, sedangkan dengan 17 suara positif gagal.-1
dari sebuah string (seperti yang diminta dalam contoh)?byte
s negatif dalam larik Anda.http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Hex.html
sumber
Angka yang Anda enkode menjadi heksadesimal harus mewakili beberapa pengkodean karakter, seperti UTF-8. Jadi pertama-tama ubah String menjadi byte [] yang mewakili string dalam pengkodean itu, kemudian ubah setiap byte menjadi heksadesimal.
sumber
Penggunaan
DatatypeConverter.printHexBinary()
:Contoh penggunaan:
Cetakan:
Catatan : Ini menyebabkan sedikit masalah ekstra dengan
Java 9
dan yang lebih baru karena API tidak disertakan secara default. Untuk referensi, misalnya lihat masalah iniGitHub
.sumber
Berikut solusi lain
sumber
format("%02x")
jadi format () selalu menggunakan 2 karakter. Meskipun ASCII adalah hex digit ganda yaitu A = 0x65Semua jawaban berdasarkan String.getBytes () melibatkan pengkodean string Anda sesuai dengan Charset. Anda tidak perlu mendapatkan nilai hex dari 2-byte karakter yang membentuk string Anda. Jika yang Anda inginkan sebenarnya setara dengan hex viewer, maka Anda perlu mengakses karakternya secara langsung. Inilah fungsi yang saya gunakan dalam kode saya untuk men-debug masalah Unicode:
Kemudian, stringToHex ("testing123") akan memberi Anda:
sumber
Anda dapat kembali
hexString
pada titik ini, dengan peringatan bahwa karakter null terkemuka akan dihilangkan, dan hasilnya akan memiliki panjang ganjil jika byte pertama kurang dari 16. Jika Anda perlu menangani kasus tersebut, Anda dapat menambahkan beberapa kode tambahan untuk diisi dengan 0s:sumber
Untuk mendapatkan nilai Integer dari hex
sumber
Ubah huruf menjadi kode hex dan kode hex dalam huruf.
sumber
Saya akan menyarankan sesuatu seperti ini, di mana
str
string input Anda:sumber
Pertama ubah menjadi byte menggunakan fungsi getBytes () dan kemudian ubah menjadi hex gunakan ini:
sumber
Untuk pergi ke arah lain (hex ke string), Anda bisa menggunakan
sumber
sumber
sumber
Ubah String menjadi Heksadesimal :
pasti ini cara yang mudah.
sumber
Menggunakan bantuan Banyak Orang dari beberapa Utas ..
Saya tahu ini telah dijawab, tetapi saya ingin memberikan metode encode & decode lengkap untuk orang lain dalam situasi yang sama ..
Inilah metode Encoding & Decoding saya ..
sumber
Jauh lebih baik:
sumber
Berikut adalah beberapa tolok ukur yang membandingkan pendekatan dan pustaka yang berbeda. Guava mengalahkan Apache Commons Codec saat mendekode. Commons Codec mengalahkan Jambu dalam pengkodean. Dan JHex mengalahkan keduanya untuk decoding dan encoding.
Contoh JHex
Semuanya ada dalam satu file kelas untuk JHex . Jangan ragu untuk menyalin dan menempel jika Anda tidak menginginkan pustaka lain di pohon ketergantungan Anda. Perhatikan juga, ini hanya tersedia sebagai jar Java 9 sampai saya dapat mengetahui cara mempublikasikan beberapa target rilis dengan Gradle dan plugin Bintray.
sumber
Cara singkat dan mudah untuk mengonversi String menjadi notasi Heksadesimalnya adalah:
sumber
periksa solusi ini untuk String ke hex dan hex ke String vise-versa
Outputnya sebagai berikut:
sumber