Encoding dan Decoding Java Base64

1. Ikhtisar

Dalam tutorial ini, kami menjelajahi berbagai utilitas yang menyediakan fungsionalitas encoding dan decoding Base64 di Java.

Kami terutama akan mengilustrasikan API Java 8 baru dan API utilitas yang keluar dari Apache Commons.

2. Java 8 untuk Base 64

Java 8 akhirnya menambahkan kemampuan Base64 ke API standar. Ini melalui kelas utilitas java.util.Base64 .

Mari kita mulai dengan melihat proses pembuat enkode dasar.

2.1. Java 8 Dasar Base64

Encoder dasar membuat semuanya tetap sederhana dan mengkodekan input apa adanya, tanpa pemisahan baris.

Outputnya dipetakan ke satu set karakter dalam set karakter A-Za-z0-9 + / , dan decoder menolak karakter apa pun di luar set ini.

Pertama-tama mari kita menyandikan String sederhana :

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

Perhatikan bagaimana kami mengambil Encoder API lengkap melalui metode utilitas getEncoder () sederhana .

Sekarang mari kita decode String itu kembali ke bentuk aslinya:

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

2.2. Pengkodean Java 8 Base64 Tanpa Padding

Dalam pengkodean Base64, panjang String yang dikodekan keluaran harus kelipatan tiga. Jika tidak, output akan diisi dengan karakter pad tambahan ( = ).

Setelah decoding, karakter padding tambahan ini akan dibuang. Untuk menggali lebih dalam padding di Base64, lihat jawaban mendetail ini di Stack Overflow.

Jika kita perlu melewatkan pengisi output - mungkin karena String yang dihasilkan tidak akan pernah didekodekan kembali - kita cukup memilih untuk menyandikan tanpa padding :

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

2.3. Pengkodean URL Java 8

Encoding URL sangat mirip dengan encoder dasar yang kita lihat di atas. Ini menggunakan URL dan alfabet Safe Base64 Nama File dan tidak menambahkan pemisahan baris apa pun:

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

Penguraian kode terjadi dengan cara yang hampir sama. The getUrlDecoder () metode utilitas mengembalikan java.util.Base64.Decoder yang kemudian digunakan untuk memecahkan kode URL:

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

2.4. Pengkodean MIME Java 8

Mari kita mulai dengan membuat beberapa masukan MIME dasar untuk dikodekan:

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

Pembuat enkode MIME menghasilkan keluaran yang dikodekan Base64 menggunakan alfabet dasar tetapi dalam format yang sesuai untuk MIME.

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

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

The getMimeDecoder () metode utilitas mengembalikan java.util.Base64.Decoder yang kemudian digunakan dalam proses decoding:

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

3. Encoding / Decoding Menggunakan Kode Apache Commons

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

 commons-codec commons-codec 1.10 

Perhatikan bahwa kami dapat memeriksa apakah versi pustaka yang lebih baru telah dirilis di Maven Central.

API utama adalah kelas org.apache.commons.codec.binary.Base64 , yang dapat diparameterisasi dengan berbagai konstruktor:

  • Base64 (boolean urlSafe) membuat API Base64 dengan mengontrol mode aman URL - aktif atau nonaktif.
  • Base64 (int lineLength) membuat Base64 API dalam mode URL-tidak aman dan mengontrol panjang baris (standarnya 76).
  • Base64 (int lineLength, byte [] lineSeparator) membuat Base64 API dengan menerima pemisah baris tambahan, yang secara default adalah CRLF ("\ r \ n").

Setelah API Base64 dibuat, encoding dan decoding cukup sederhana:

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

Metode decode () dari kelas Base64 mengembalikan string yang didekodekan:

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

Opsi sederhana lainnya adalah menggunakan API statis Base64 daripada membuat sebuah instance:

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

4. Mengubah String menjadi Array byte

Terkadang, kita perlu mengubah String menjadi byte [] . Cara termudah untuk melakukannya adalah dengan menggunakan metode 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.

Terakhir, ada beberapa API lain yang menyediakan fungsionalitas serupa: java.xml.bind.DataTypeConverter dengan printHexBinary dan parseBase64Binary .

Potongan kode dapat ditemukan di GitHub.