Kódovanie a dekódovanie Java Base64
1. Prehľad
V tomto tutoriáli skúmame rôzne pomocné programy, ktoré poskytujú funkcionalitu kódovania a dekódovania Base64 v Jave.
Ideme hlavne ilustrovať nové API 8 Java a API API, ktoré vychádzajú z Apache Commons.
2. Java 8 pre Base 64
Java 8 konečne pridala možnosti Base64 na štandardné API. Toto je prostredníctvom java.util.Base64 úžitková trieda.
Na úvod sa pozrieme na základný proces kódovania.
2.1. Java 8 Basic Base64
Základný kódovač udržuje veci jednoduché a kóduje vstup tak, ako je, bez akejkoľvek separácie riadkov.
Výstup je mapovaný na množinu znakov v A-Za-z0-9 + / znakovú sadu a dekodér odmietne všetky znaky mimo tejto sady.
Poďme najskôr zakódovať jednoduchý reťazec:
Reťazec originalInput = "testovací vstup"; Reťazec encodedString = Base64.getEncoder (). EncodeToString (originalInput.getBytes ());
Všimnite si, ako pomocou jednoduchého načítame úplné rozhranie Encoder API getEncoder () úžitková metóda.
Poďme teraz tento reťazec dekódovať späť do pôvodnej formy:
byte [] decodedBytes = Base64.getDecoder (). decode (encodedString); Reťazec decodedString = nový Reťazec (decodedBytes);
2.2. Kódovanie Java 8 Base64 bez polstrovania
V kódovaní Base64 musí byť dĺžka reťazca kódovaného výstupom násobkom troch. Ak nie, bude výstup vyplnený ďalšími znakmi pre pad (=).
Po dekódovaní sa tieto ďalšie znaky s polstrovaním zahodia. Ak sa chcete podrobnejšie zaoberať výplňou v Base64, pozrite si túto podrobnú odpoveď na stránke Stack Overflow.
Ak potrebujeme preskočiť polstrovanie výstupu - možno preto, že výsledný reťazec nebude nikdy dekódovaný späť - môžeme sa jednoducho rozhodnúť kódovať bez výplne:
Reťazec encodedString = Base64.getEncoder (). WithoutPadding (). EncodeToString (originalInput.getBytes ());
2.3. Kódovanie URL Java 8
Kódovanie URL je veľmi podobné základnému kódovaču, na ktorý sme sa pozreli vyššie. Používa abecedu URL a názov súboru Safe Base64 a nepridáva žiadne oddelenie riadkov:
Reťazec originalUrl = "//www.google.co.nz/?gfe_rd=cr&ei=dzbFV&gws_rd=ssl#q=java"; Reťazec encodedUrl = Base64.getUrlEncoder (). EncodeToString (originalURL.getBytes ());
Dekódovanie sa deje v podstate rovnakým spôsobom. The getUrlDecoder () užitočná metóda vráti a java.util.Base64.Decoder ktorý sa potom použije na dekódovanie adresy URL:
byte [] decodedBytes = Base64.getUrlDecoder (). decode (encodedUrl); Reťazec decodedUrl = nový Reťazec (decodedBytes);
2.4. Java 8 MIME kódovanie
Začnime generovaním niektorých základných vstupov MIME na kódovanie:
private static StringBuilder getMimeBuffer () {StringBuilder buffer = nový StringBuilder (); pre (int count = 0; count <10; ++ count) {buffer.append (UUID.randomUUID (). toString ()); } návratová medzipamäť; }
MIME kódovač generuje výstup kódovaný pomocou Base64 pomocou základnej abecedy, ale vo formáte vhodnom pre MIME.
Každý riadok výstupu nemá viac ako 76 znakov a končí sa znakom konce riadku, za ktorým nasleduje riadok (\ r \ n):
StringBuilder buffer = getMimeBuffer (); byte [] encodedAsBytes = buffer.toString (). getBytes (); Reťazec encodedMime = Base64.getMimeEncoder (). EncodeToString (encodedAsBytes);
The getMimeDecoder () úžitková metóda vráti a java.util.Base64.Decoder ktorý sa potom použije v procese dekódovania:
byte [] decodedBytes = Base64.getMimeDecoder (). dekódovať (encodedMime); Reťazec decodedMime = nový Reťazec (decodedBytes);
3. Kódovanie / dekódovanie pomocou kódu Apache Commons
Najprv musíme definovať závislosť commons-kodeku v pom.xml:
commons-codec commons-codec 1.10
Upozorňujeme, že môžeme skontrolovať, či boli v Maven Central vydané novšie verzie knižnice.
Hlavným API je org.apache.commons.codec.binary.Base64 triedy, ktorú je možné parametrizovať rôznymi konštruktormi:
- Base64 (boolean urlSafe) vytvára rozhranie Base64 API ovládaním bezpečného režimu URL - zapnutím alebo vypnutím.
- Base64(int lineLength) vytvorí rozhranie Base64 API v režime bezpečnom pre URL a riadi dĺžku riadku (predvolená hodnota je 76).
- Base64 (int lineLength, byte [] lineSeparator) vytvorí rozhranie Base64 API prijatím oddeľovača riadkov navyše, ktorý je predvolene nastavený na CRLF („\ r \ n“).
Po vytvorení API Base64 je kódovanie aj dekódovanie celkom jednoduché:
Reťazec originalInput = "testovací vstup"; Base64 base64 = nový Base64 (); String encodedString = new String (base64.encode (originalInput.getBytes ()));
The dekódovať () metóda Base64 trieda vráti dekódovaný reťazec:
String decodedString = nový String (base64.decode (encodedString.getBytes ()));
Ďalšou jednoduchou možnosťou je pomocou statického API z Base64namiesto vytvorenia inštancie:
Reťazec originalInput = "testovací vstup"; String encodedString = nový String (Base64.encodeBase64 (originalInput.getBytes ())); String decodedString = nový String (Base64.decodeBase64 (encodedString.getBytes ()));
4. Konverzia a String do a bajt Pole
Niekedy musíme previesť a String do a byte []. Najjednoduchší spôsob, ako to urobiť, je použiť StringgetBytes () metóda:
Reťazec originalInput = "testovací vstup"; byte [] výsledok = originalInput.getBytes (); assertEquals (originalInput.length (), result.length);
Je lepšie poskytovať aj kódovanie a nezávisieť od predvoleného kódovania, pretože je závislé od systému:
Reťazec originalInput = "testovací vstup"; byte [] výsledok = originalInput.getBytes (StandardCharsets.UTF_16); assertTrue (originalInput.length () <result.length);
Ak je náš reťazec Base64 zakódované, môžeme použiť Base64 dekodér:
Reťazec originalInput = "dGVzdCBpbnB1dA =="; byte [] výsledok = Base64.getDecoder (). decode (originalInput); assertEquals ("testovací vstup", nový reťazec (výsledok));
Môžeme tiež použiť DatatypeConverter parseBase64Binary () metóda:
Reťazec originalInput = "dGVzdCBpbnB1dA =="; byte [] výsledok = DatatypeConverter.parseBase64Binary (originalInput); assertEquals ("testovací vstup", nový reťazec (výsledok));
Na záver môžeme previesť hexadecimálne číslo String do a byte [] použitím Prevádzač dátových typov metóda:
Reťazec originalInput = "7465737420696E707574"; byte [] výsledok = DatatypeConverter.parseHexBinary (originalInput); assertEquals ("testovací vstup", nový reťazec (výsledok));
5. Záver
Tento článok vysvetlil základy toho, ako robiť kódovanie a dekódovanie Base64 v Jave pomocou nových API zavedených v Jave 8 a Apache Commons.
Na záver treba spomenúť niekoľko ďalších rozhraní API, ktoré poskytujú podobné funkcie: java.xml.bind.DataTypeConverter s printHexBinary a parseBase64Binary.
Útržky kódu nájdete na GitHub.