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.