Pengekodan dan Penyahkodan Java Base64

1. Gambaran keseluruhan

Dalam tutorial ini, kami meneroka pelbagai utiliti yang menyediakan fungsi pengekodan dan penyahkodan Base64 di Java.

Kami terutama akan menggambarkan API Java 8 baru dan API utiliti yang keluar dari Apache Commons.

2. Java 8 untuk Pangkalan 64

Java 8 akhirnya menambahkan keupayaan Base64 ke API standard. Ini melalui kelas utiliti java.util.Base64 .

Mari mulakan dengan melihat proses pengekod asas.

2.1. Java 8 Pangkalan Asas64

Pengekod asas membuat perkara mudah dan menyandikan input sebagaimana adanya, tanpa pemisahan garis.

Keluaran dipetakan ke sekumpulan aksara dalam set karakter A-Za-z0-9 + , dan penyahkod menolak sebarang watak di luar set ini.

Mari kita mengekodkan Rentetan ringkas :

String originalInput = "test input"; String encodedString = Base64.getEncoder().encodeToString(originalInput.getBytes()); 

Perhatikan bagaimana kita mendapatkan semula Encoder API melalui kaedah utiliti getEncoder () yang mudah .

Sekarang mari kita susun semula String kembali ke bentuk asal:

byte[] decodedBytes = Base64.getDecoder().decode(encodedString); String decodedString = new String(decodedBytes);

2.2. Pengekodan Java 8 Base64 Tanpa Padding

Dalam pengekodan Base64, panjang String yang dikodkan output mestilah gandaan tiga. Sekiranya tidak, output akan dilapisi dengan watak pad tambahan ( = ).

Setelah penyahkodan, watak padding tambahan ini akan dibuang. Untuk menggali lebih mendalam ke padding di Base64, lihat jawapan terperinci ini di Stack Overflow.

Sekiranya kita perlu melangkau padding output - mungkin kerana String yang dihasilkan tidak akan dapat dinyahkodkan kembali - kita boleh memilih untuk menyandikan tanpa padding :

String encodedString = Base64.getEncoder().withoutPadding().encodeToString(originalInput.getBytes());

2.3. Pengekodan URL Java 8

Pengekodan URL sangat serupa dengan pengekod asas yang kita lihat di atas. Ia menggunakan abjad URL dan Nama Fail Safe Base64 dan tidak menambahkan pemisahan baris:

String originalUrl = "//www.google.co.nz/?gfe_rd=cr&ei=dzbFV&gws_rd=ssl#q=java"; String encodedUrl = Base64.getUrlEncoder().encodeToString(originalURL.getBytes()); 

Penyahkodan berlaku dengan cara yang hampir sama. The getUrlDecoder () kaedah utiliti mengembalikan java.util.Base64.Decoder yang kemudiannya digunakan untuk memecahkan kod URL:

byte[] decodedBytes = Base64.getUrlDecoder().decode(encodedUrl); String decodedUrl = new String(decodedBytes); 

2.4. Pengekodan Java 8 MIME

Mari mulakan dengan menghasilkan beberapa input MIME asas untuk mengekod:

private static StringBuilder getMimeBuffer() { StringBuilder buffer = new StringBuilder(); for (int count = 0; count < 10; ++count) { buffer.append(UUID.randomUUID().toString()); } return buffer; }

Pengekod MIME menghasilkan output yang dikodkan Base64 menggunakan abjad asas tetapi dalam format yang mesra MIME.

Setiap baris output tidak lebih dari 76 aksara dan diakhiri dengan carriage return diikuti dengan lineline ( \ r \ n ):

StringBuilder buffer = getMimeBuffer(); byte[] encodedAsBytes = buffer.toString().getBytes(); String encodedMime = Base64.getMimeEncoder().encodeToString(encodedAsBytes);

The getMimeDecoder () kaedah utiliti mengembalikan java.util.Base64.Decoder yang kemudiannya digunakan dalam proses penyahkodan:

byte[] decodedBytes = Base64.getMimeDecoder().decode(encodedMime); String decodedMime = new String(decodedBytes); 

3. Pengekodan / Penyahkodan Menggunakan Kod Apache Commons

Pertama, kita perlu menentukan ketergantungan commons-codec di pom.xml :

 commons-codec commons-codec 1.10 

Perhatikan bahawa kami dapat memeriksa apakah versi perpustakaan yang lebih baru telah dikeluarkan di Maven Central.

API utama adalah kelas org.apache.commons.codec.binary.Base64 , yang boleh diukur dengan pelbagai pembina:

  • Base64 (boolean urlSafe) membuat API Base64 dengan mengawal mod selamat URL - hidup atau mati.
  • Base64 (int lineLength) membuat Base64 API dalam mod URL-tidak selamat dan mengawal panjang baris (lalai adalah 76).
  • Base64 (int lineLength, byte [] lineSeparator) membuat Base64 API dengan menerima pemisah baris tambahan, yang secara lalai adalah CRLF (ā€œ\ r \ nā€).

Setelah API Base64 dibuat, pengekodan dan penyahkodan agak mudah:

String originalInput = "test input"; Base64 base64 = new Base64(); String encodedString = new String(base64.encode(originalInput.getBytes())); 

The decode () kaedah Base64 kelas mengembalikan rentetan yang dinyahkod:

String decodedString = new String(base64.decode(encodedString.getBytes())); 

Pilihan mudah lain adalah menggunakan API statik Base64 dan bukannya membuat contoh:

String originalInput = "test input"; String encodedString = new String(Base64.encodeBase64(originalInput.getBytes())); String decodedString = new String(Base64.decodeBase64(encodedString.getBytes()));

4. Menukar Rentetan ke Array bait

Kadang kala, kita perlu menukar String ke bait [] . Cara termudah untuk melakukannya adalah dengan menggunakan kaedah String getBytes () :

String originalInput = "test input"; byte[] result = originalInput.getBytes(); assertEquals(originalInput.length(), result.length);

It's better to provide encoding as well and not depend on default encoding, as it's system dependent:

String originalInput = "test input"; byte[] result = originalInput.getBytes(StandardCharsets.UTF_16); assertTrue(originalInput.length() < result.length);

If our String is Base64 encoded, we can use the Base64 decoder:

String originalInput = "dGVzdCBpbnB1dA=="; byte[] result = Base64.getDecoder().decode(originalInput); assertEquals("test input", new String(result));

We can also use DatatypeConverter parseBase64Binary() method:

String originalInput = "dGVzdCBpbnB1dA=="; byte[] result = DatatypeConverter.parseBase64Binary(originalInput); assertEquals("test input", new String(result));

Finally, we can convert a hexadecimal String to a byte[] using DatatypeConverter method:

String originalInput = "7465737420696E707574"; byte[] result = DatatypeConverter.parseHexBinary(originalInput); assertEquals("test input", new String(result));

5. Conclusion

This article explained the basics of how to do Base64 encoding and decoding in Java using the new APIs introduced in Java 8 and Apache Commons.

Akhirnya, terdapat beberapa API lain yang perlu disebutkan yang memberikan fungsi serupa: java.xml.bind.DataTypeConverter with printHexBinary dan parseBase64Binary .

Coretan kod boleh didapati di GitHub.