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.


$config[zx-auto] not found$config[zx-overlay] not found