Кодиране и декодиране на Java Base64

1. Общ преглед

В този урок ние изследваме различните помощни програми, които предоставят функционалност за кодиране и декодиране Base64 в Java.

Основно ще илюстрираме новите API на Java 8 и помощните API, които излизат от Apache Commons.

2. Java 8 за база 64

Java 8 най-накрая добави Base64 възможности към стандартния API. Това става чрез класа на помощната програма java.util.Base64 .

Нека започнем с разглеждането на основен процес на кодиране.

2.1. Java 8 Basic Base64

Основният енкодер улеснява нещата и кодира входа както е, без никакво разделяне на редове.

Изходът се преобразува в набор от символи в A-Za-z0-9 + / набор от символи и декодерът отхвърля всеки символ извън този набор.

Нека първо кодираме прост низ :

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

Обърнете внимание как извличаме пълния API на Encoder чрез простия метод на помощната програма getEncoder () .

Нека сега декодираме този низ обратно към първоначалната форма:

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

2.2. Кодиране на Java 8 Base64 без подплата

В кодирането Base64 дължината на кодирания изход String трябва да е кратна на три. Ако не, изходът ще бъде подплатен с допълнителни символи за подложка ( = ).

При декодирането тези допълнителни символи за подложка ще бъдат изхвърлени. За да се задълбочите в подложката в Base64, вижте този подробен отговор на Stack Overflow.

Ако трябва да пропуснем подложката на изхода - може би защото полученият низ никога няма да бъде декодиран обратно - можем просто да изберем да кодираме без подложка :

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

2.3. Кодиране на URL адреси на Java 8

Кодирането на URL е много подобно на основния кодер, който разгледахме по-горе. Той използва URL адреса и името на файла Safe Base64 азбука и не добавя никакво разделяне на редове:

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

Декодирането се случва по същия начин. В getUrlDecoder () метод, полезност връща java.util.Base64.Decoder , че след това се използва за декодиране на адрес:

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

2.4. Java 8 MIME кодиране

Нека започнем с генериране на някои основни MIME входни данни за кодиране:

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

MIME кодерът генерира Base64 кодиран изход, използвайки основната азбука, но в MIME формат.

Всеки ред от изхода не е по-дълъг от 76 знака и завършва с връщане на карета, последвано от подаване на линия ( \ r \ n ):

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

В getMimeDecoder () метод полезност връща java.util.Base64.Decoder който след това се използва в процеса на декодиране:

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

3. Кодиране / декодиране с помощта на Apache Commons Code

Първо, трябва да дефинираме зависимостта commons-codec в pom.xml :

 commons-codec commons-codec 1.10 

Имайте предвид, че можем да проверим дали по-нови версии на библиотеката са пуснати в Maven Central.

Основният API е класът org.apache.commons.codec.binary.Base64 , който може да бъде параметризиран с различни конструктори:

  • Base64 (boolean urlSafe) създава API на Base64, като контролира URL-безопасен режим - включен или изключен.
  • Base64 (int lineLength) създава API Base64 в режим, който не е безопасен за URL и контролира дължината на реда (по подразбиране е 76).
  • Base64 (int lineLength, байт [] lineSeparator) създава API на Base64, като приема допълнителен разделител на редове, който по подразбиране е CRLF (“\ r \ n”).

След като API на Base64 е създаден, както кодирането, така и декодирането са доста прости:

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

Методът decode () на класа Base64 връща декодирания низ:

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

Друга проста опция е да използвате статичния API на Base64, вместо да създавате екземпляр:

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

4. Преобразуване на String в байтов масив

Понякога трябва да преобразуваме String в байт [] . Най-простият начин да направите това е да използвате метода 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.

И накрая, има няколко други API, които си струва да се споменат, които предоставят подобна функционалност: java.xml.bind.DataTypeConverter с printHexBinary и parseBase64Binary .

Кодови фрагменти могат да бъдат намерени в GitHub.