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.