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.