Kodiranje i dekodiranje Java Base64

1. Pregled

U ovom uputstvu istražujemo razne uslužne programe koji pružaju Base64 funkcionalnost kodiranja i dekodiranja u Javi.

Uglavnom ćemo ilustrirati nove Java 8 API-je i uslužne API-je koji izlaze iz Apache Commons.

2. Java 8 za bazu 64

Java 8 napokon je dodala mogućnosti Base64 na standardni API. Ovo je putem java.util.Base64 klasa korisnosti.

Započnimo s proučavanjem osnovnog postupka kodera.

2.1. Java 8 Basic Base64

Osnovni koder olakšava stvari i kodira ulaz onakav kakav jest, bez ikakvog odvajanja linija.

Izlaz se preslikava na skup znakova u A-Za-z0-9 + / skupa znakova, a dekoder odbija bilo koji znak izvan ovog skupa.

Krenimo prvo kodirati jednostavni niz:

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

Primijetite kako dohvaćamo puni API kodera putem jednostavnog getEncoder () korisna metoda.

Dekodirajmo taj niz natrag u izvorni oblik:

bajt [] decodedBytes = Base64.getDecoder (). decode (encodedString); Niz decodedString = novi niz (decodedBytes);

2.2. Java 8 Base64 kodiranje bez popunjavanja

U Base64 kodiranju, duljina niza kodiranog izlazom mora biti višestruka od tri. Ako nije, izlaz će biti dodatan dodatnim znakovima jastučića (=).

Nakon dekodiranja, ovi dodatni znakovi za dodavanje bit će odbačeni. Da biste dublje istražili umetanje u Base64, pogledajte ovaj detaljni odgovor na Stack Overflow.

Ako trebamo preskočite popunjavanje rezultata - možda zato što rezultirajući niz nikada neće biti dekodiran - možemo jednostavno odabrati kodiraj bez popunjavanja:

Niz encodedString = Base64.getEncoder (). WithoutPadding (). EncodeToString (originalInput.getBytes ());

2.3. Kodiranje URL-a Java 8

URL kodiranje vrlo je slično osnovnom koderu koji smo gledali gore. Koristi URL i naziv datoteke Safe Base64 abeceda i ne dodaje nikakvo odvajanje redaka:

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

Dekodiranje se događa na sličan način. The getUrlDecoder () korisna metoda vraća a java.util.Base64.Dekoder koja se zatim koristi za dekodiranje URL-a:

bajt [] decodedBytes = Base64.getUrlDecoder (). decode (encodedUrl); Niz decodedUrl = novi niz (decodedBytes); 

2.4. Java 8 MIME kodiranje

Počnimo s generiranjem osnovnog MIME ulaza za kodiranje:

privatni statički StringBuilder getMimeBuffer () {StringBuilder buffer = novi StringBuilder (); for (int count = 0; count <10; ++ count) {buffer.append (UUID.randomUUID (). toString ()); } povratni međuspremnik; }

MIME koder generira Base64 kodirani izlaz koristeći osnovnu abecedu, ali u MIME prikladnom formatu.

Svaki redak izlaza nije duži od 76 znakova i završava povratkom kočije nakon čega slijedi dodavanje linije (\ r \ n):

StringBuilder buffer = getMimeBuffer (); bajt [] encodedAsBytes = buffer.toString (). getBytes (); Niz encodedMime = Base64.getMimeEncoder (). EncodeToString (encodedAsBytes);

The getMimeDecoder () korisna metoda vraća a java.util.Base64.Dekoder koji se zatim koristi u procesu dekodiranja:

bajt [] decodedBytes = Base64.getMimeDecoder (). decode (encodedMime); Niz decodedMime = novi niz (decodedBytes); 

3. Kodiranje / dekodiranje pomoću Apache Commons koda

Prvo, moramo definirati ovisnost o zajedničkom kodeku u pom.xml:

 commons-codec commons-codec 1.10 

Imajte na umu da možemo provjeriti jesu li na Maven Central objavljene novije verzije knjižnice.

Glavni API je org.apache.commons.codec.binary.Base64 klase, koja se može parametrizirati raznim konstruktorima:

  • Base64 (logički urlSafe) stvara Base64 API upravljanjem URL-sigurnim načinom rada - uključeno ili isključeno.
  • Baza64(int lineLength) stvara Base64 API u načinu koji nije siguran za URL i kontrolira duljinu retka (zadana vrijednost je 76).
  • Base64 (int lineLength, byte [] lineSeparator) kreira API Base64 prihvaćajući dodatni razdvajač redaka, koji je prema zadanim postavkama CRLF (“\ r \ n”).

Jednom kada se kreira Base64 API, i kodiranje i dekodiranje postaju vrlo jednostavni:

String originalInput = "test input"; Base64 base64 = novi Base64 (); Niz encodedString = novi niz (base64.encode (originalInput.getBytes ())); 

The dekodiraj () metoda Baza64 klasa vraća dekodirani niz:

Niz decodedString = novi niz (base64.decode (encodedString.getBytes ())); 

Još jedna jednostavna opcija je koristeći statički API od Baza64umjesto stvaranja instance:

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

4. Pretvaranje a Niz do a bajt Polje

Ponekad moramo pretvoriti a Niz do a bajt[]. Najjednostavniji način za to je korištenje NizgetBytes () metoda:

String originalInput = "test input"; bajt [] rezultat = originalInput.getBytes (); assertEquals (originalInput.length (), result.length);

Bolje je pružiti i kodiranje i ne ovisiti o zadanom kodiranju, jer ovisi o sustavu:

String originalInput = "test input"; bajt [] rezultat = originalInput.getBytes (StandardCharsets.UTF_16); assertTrue (originalInput.length () <result.length);

Ako je naš String Baza64 kodirano, možemo koristiti baza64 dekoder:

Niz originalInput = "dGVzdCBpbnB1dA =="; bajt [] rezultat = Base64.getDecoder (). decode (originalInput); assertEquals ("test input", novi String (rezultat));

Možemo i koristiti DatatypeConverter parseBase64Binary () metoda:

Niz originalInput = "dGVzdCBpbnB1dA =="; bajt [] rezultat = DatatypeConverter.parseBase64Binary (originalInput); assertEquals ("test input", novi String (rezultat));

Napokon, možemo pretvoriti heksadecimalni Niz do a bajt[] koristeći Pretvarač tipa podataka metoda:

Niz originalInput = "7465737420696E707574"; bajt [] rezultat = DatatypeConverter.parseHexBinary (originalInput); assertEquals ("test input", novi String (rezultat));

5. Zaključak

Ovaj je članak objasnio osnove kako napraviti Base64 kodiranje i dekodiranje u Javi pomoću novih API-ja predstavljenih u Java 8 i Apache Commons.

Na kraju, vrijedi spomenuti nekoliko drugih API-ja koji pružaju sličnu funkcionalnost: java.xml.bind.DataTypeConverter s printHexBinary i parseBase64Binarni.

Isječke koda možete pronaći na GitHubu.