Java Base64 kódolás és dekódolás

1. Áttekintés

Ebben az oktatóanyagban megvizsgáljuk a különféle segédprogramokat, amelyek biztosítják a Java-ban az Base64 kódolási és dekódolási funkciókat.

Elsősorban az új Java 8 API-kat és az Apache Commonsból megjelenő segédprogram API-kat mutatjuk be.

2. Java 8 a 64-es bázishoz

A Java 8 végül hozzáadta a Base64 képességeit a szabványos API-hoz. Ez a java.util.Base64 hasznossági osztály.

Kezdjük azzal, hogy megnézzük az alapvető kódoló folyamatot.

2.1. Java 8 Basic Base64

Az alapkódoló egyszerűvé teszi a dolgokat, és kódolja a bemenetet úgy, ahogy van, vonalelválasztás nélkül.

A kimenet a karakterkészlethez van hozzárendelve A-Za-z0-9 + / karakterkészlet, és a dekóder elutasít minden olyan karaktert, amely ezen a készleten kívül van.

Nézzük először kódoljon egy egyszerű karakterláncot:

String originalInput = "tesztbevitel"; String encodedString = Base64.getEncoder (). EncodeToString (originalInput.getBytes ()); 

Ne feledje, hogy a teljes kódoló API-t hogyan szerezzük be az egyszerűn keresztül getEncoder () hasznossági módszer.

Dekódoljuk vissza ezt a karakterláncot az eredeti formára:

byte [] decodedBytes = Base64.getDecoder (). dekódolás (encodedString); String decodedString = új karakterlánc (decodedBytes);

2.2. Java 8 Base64 kódolás kitöltés nélkül

Base64 kódolás esetén a kimenet által kódolt karakterlánc hosszának háromszorosának kell lennie. Ha nem, akkor a kimenetet további betű karakterekkel (=).

Dekódoláskor ezeket az extra kitöltési karaktereket elvetjük. Ha mélyebbre akarsz ásni a Base64-ben, nézd meg ezt a részletes választ a Verem túlcsordulásról

Ha kell hagyja ki a kimenet kitöltését - talán azért, mert az így kapott Stringet soha nem fogják visszakódolni - egyszerűen választhatunk kódolás párnázás nélkül:

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

2.3. Java 8 URL kódolás

Az URL-kódolás nagyon hasonlít az alapkódolóhoz, amelyet fentebb megnéztünk. Az URL-t és a Fájlnév Biztonságos Base64 ábécét használja, és nem ad hozzá sortávolítást:

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

A dekódolás nagyjából ugyanúgy történik. A getUrlDecoder () hasznossági metódus a java.util.Base64. Dekóder amelyet azután dekódolnak az URL-re:

byte [] decodedBytes = Base64.getUrlDecoder (). dekódolás (encodedUrl); String decodedUrl = új karakterlánc (decodedBytes); 

2.4. Java 8 MIME kódolás

Kezdjük azzal, hogy generálunk néhány alapvető MIME-bemenetet a kódoláshoz:

privát statikus StringBuilder getMimeBuffer () {StringBuilder puffer = new StringBuilder (); for (int count = 0; count <10; ++ count) {buffer.append (UUID.randomUUID (). toString ()); } visszatérő puffer; }

A MIME kódoló egy Base64-kódolású kimenetet generál az alap ábécé használatával, de MIME-barát formátumban.

A kimenet minden sora nem lehet hosszabb 76 karakternél, és egy kocsivisszával fejeződik be, amelyet egy soradagolás követ\ r \ n):

StringBuilder puffer = getMimeBuffer (); byte [] encodedAsBytes = buffer.toString (). getBytes (); String encodedMime = Base64.getMimeEncoder (). EncodeToString (encodedAsBytes);

A getMimeDecoder () a utility metódus a java.util.Base64. Dekóder amelyet a dekódolási folyamat során használnak:

byte [] decodedBytes = Base64.getMimeDecoder (). dekódolás (encodedMime); String decodedMime = új karakterlánc (decodedBytes); 

3. Kódolás / dekódolás az Apache Commons Code használatával

Először meg kell határoznunk a commons-kodek függőséget a pom.xml:

 commons-kodek commons-kodek 1.10 

Ne feledje, hogy ellenőrizhetjük, hogy a könyvtár újabb verziói megjelentek-e a Maven Centralon.

A fő API az org.apache.commons.codec.binary.Base64 osztály, amely különböző konstruktorokkal paraméterezhető:

  • Base64 (boolean urlSafe) létrehozza a Base64 API-t az URL-biztonságos mód vezérlésével - be vagy ki.
  • Base64(int lineLength) URL-nem biztonságos módban létrehozza a Base64 API-t, és szabályozza a vonal hosszát (alapértelmezés szerint 76).
  • Base64 (int lineLength, byte [] lineSeparator) létrehoz egy Base64 API-t egy extra sorelválasztó elfogadásával, amely alapértelmezés szerint CRLF (“\ r \ n”).

A Base64 API létrehozása után a kódolás és a dekódolás is nagyon egyszerű:

String originalInput = "tesztbevitel"; Base64 base64 = új Base64 (); String encodedString = új String (base64.encode (originalInput.getBytes ())); 

A dekódolni () a metódusa Base64 osztály visszaküldi a dekódolt karakterláncot:

String decodedString = új String (base64.decode (encodedString.getBytes ())); 

Egy másik egyszerű lehetőség az a statikus API segítségével Base64példány létrehozása helyett:

String originalInput = "tesztbevitel"; String encodedString = új karakterlánc (Base64.encodeBase64 (originalInput.getBytes ())); String decodedString = új karakterlánc (Base64.decodeBase64 (encodedString.getBytes ()));

4. Konvertálás a Húr a byte Sor

Néha át kell alakítanunk a Húr a byte[]. Ennek legegyszerűbb módja a használat HúrgetBytes () módszer:

String originalInput = "tesztbevitel"; bájt [] eredmény = eredetiInput.getBytes (); assertEquals (eredetiBemenet.hossz (), eredmény.hossz);

Jobb, ha kódolást is biztosít, és nem függ az alapértelmezett kódolástól, mivel rendszerfüggő:

String originalInput = "tesztbevitel"; bájt [] eredmény = eredetiInput.getBytes (StandardCharsets.UTF_16); assertTrue (eredetiInput.length () <eredmény.hossz);

Ha a húrunk az Base64 kódolva, használhatjuk az Alap64 dekóder:

String originalInput = "dGVzdCBpbnB1dA =="; bájt [] eredmény = Base64.getDecoder (). dekódolás (originalInput); assertEquals ("tesztbevitel", új String (eredmény));

Használhatjuk is DatatypeConverter parseBase64Binary () módszer:

String originalInput = "dGVzdCBpbnB1dA =="; bájt [] eredmény = DatatypeConverter.parseBase64Binary (originalInput); assertEquals ("tesztbevitel", új karakterlánc (eredmény));

Végül átalakíthatunk egy hexadecimális értéket Húr a byte[] felhasználásával DatatypeConverter módszer:

String originalInput = "7465737420696E707574"; bájt [] eredmény = DatatypeConverter.parseHexBinary (originalInput); assertEquals ("tesztbevitel", új String (eredmény));

5. Következtetés

Ez a cikk elmagyarázta annak alapjait, hogy miként lehet a Java-ban az Base64-et kódolni és dekódolni a Java 8-ban és az Apache Commons-ban bevezetett új API-k segítségével.

Végül van még néhány megemlítendő API, amelyek hasonló funkciókat biztosítanak: java.xml.bind.DataTypeConverter val vel printHexBinary és parseBase64Binary.

A kódrészletek megtalálhatók a GitHubon.