Java Base64-koding og dekoding
1. Oversikt
I denne veiledningen utforsker vi de forskjellige verktøyene som gir Base64-koding og dekodingfunksjonalitet i Java.
Vi skal hovedsakelig illustrere de nye Java 8 API-ene og verktøy-API-ene som kommer ut av Apache Commons.
2. Java 8 for Base 64
Java 8 har endelig lagt til Base64-funksjoner til standard API. Dette er via java.util.Base64 bruksklasse.
La oss starte med å se på en grunnleggende kodeprosess.
2.1. Java 8 Basic Base64
Den grunnleggende koderen holder ting enkelt og koder inngangen som den er, uten linjeseparasjon.
Utdataene er kartlagt til et sett med tegn i A-Za-z0-9 + / tegnsett, og dekoderen avviser ethvert tegn utenfor dette settet.
La oss først kode en enkel streng:
Streng originalInput = "testinngang"; String encodedString = Base64.getEncoder (). EncodeToString (originalInput.getBytes ());
Legg merke til hvordan vi henter hele Encoder API via det enkle getEncoder () verktøymetode.
La oss nå dekode den strengen tilbake til den opprinnelige formen:
byte [] decodedBytes = Base64.getDecoder (). decode (encodedString); String decodedString = new String (decodedBytes);
2.2. Java 8 Base64-koding uten polstring
I Base64-koding må lengden på utdata-kodet streng være et multiplum av tre. Hvis ikke, vil utgangen være polstret med flere pad-tegn (=).
Ved dekoding blir disse ekstra polstringstegnene kastet. For å grave dypere i polstring i Base64, sjekk ut dette detaljerte svaret på Stack Overflow.
Hvis vi trenger det hopp over polstringen av utgangen - kanskje fordi den resulterende strengen aldri vil bli dekodet tilbake - kan vi bare velge å kode uten polstring:
String encodedString = Base64.getEncoder (). WithoutPadding (). EncodeToString (originalInput.getBytes ());
2.3. Java 8 URL-koding
URL-koding er veldig lik den grunnleggende koderen vi så på ovenfor. Den bruker URL og filnavn Safe Base64-alfabetet og legger ikke til linjeseparasjon:
Streng originalUrl = "//www.google.co.nz/?gfe_rd=cr&ei=dzbFV&gws_rd=ssl#q=java"; Streng kodetUrl = Base64.getUrlEncoder (). EncodeToString (originalURL.getBytes ());
Avkoding skjer på omtrent samme måte. De getUrlDecoder () verktøymetoden returnerer a java.util.Base64.Decoder som deretter brukes til å dekode URL:
byte [] decodedBytes = Base64.getUrlDecoder (). dekode (encodedUrl); String decodedUrl = new String (decodedBytes);
2.4. Java 8 MIME-koding
La oss starte med å generere noen grunnleggende MIME-innganger for å kode:
privat statisk StringBuilder getMimeBuffer () {StringBuilder buffer = ny StringBuilder (); for (int count = 0; count <10; ++ count) {buffer.append (UUID.randomUUID (). toString ()); } returbuffer; }
MIME-koderen genererer en Base64-kodet utgang ved hjelp av det grunnleggende alfabetet, men i et MIME-vennlig format.
Hver linje i utgangen er ikke lenger enn 76 tegn og ender med en vognretur etterfulgt av en linjemating (\ r \ n):
StringBuilder buffer = getMimeBuffer (); byte [] kodetAsBytes = buffer.toString (). getBytes (); Streng encodedMime = Base64.getMimeEncoder (). EncodeToString (encodedAsBytes);
De getMimeDecoder () verktøymetoden returnerer a java.util.Base64.Decoder som deretter brukes i avkodingsprosessen:
byte [] decodedBytes = Base64.getMimeDecoder (). dekode (encodedMime); String decodedMime = new String (decodedBytes);
3. Koding / dekoding ved hjelp av Apache Commons-kode
Først må vi definere commons-codec avhengighet i pom.xml:
commons-codec commons-codec 1.10
Merk at vi kan sjekke om nyere versjoner av biblioteket er utgitt på Maven Central.
Hoved-API er org.apache.commons.codec.binary.Base64 klasse, som kan parametriseres med forskjellige konstruktører:
- Base64 (boolsk urlSafe) oppretter Base64 API ved å kontrollere URL-safe mode - på eller av.
- Base64(int lineLength) oppretter Base64 API i en URL-usikker modus og kontrollerer lengden på linjen (standard er 76).
- Base64 (int lineLength, byte [] lineSeparator) oppretter Base64 API ved å godta en ekstra linjeseparator, som standard er CRLF (“\ r \ n”).
Når Base64 API er opprettet, er både koding og dekoding ganske enkelt:
Streng originalInput = "testinngang"; Base64 base64 = ny Base64 (); Streng kodetString = ny streng (base64.encode (originalInput.getBytes ()));
De dekode() Metode av Base64 klasse returnerer den dekodede strengen:
Streng dekodetString = ny streng (base64.decode (encodedString.getBytes ()));
Et annet enkelt alternativ er ved hjelp av den statiske APIen til Base64i stedet for å opprette en forekomst:
Streng originalInput = "testinngang"; Streng kodetString = ny streng (Base64.encodeBase64 (originalInput.getBytes ())); String decodedString = new String (Base64.decodeBase64 (encodedString.getBytes ()));
4. Konvertering av a String til en byte Array
Noen ganger må vi konvertere en String til en byte []. Den enkleste måten å gjøre dette på er å bruke StringgetBytes () metode:
Streng originalInput = "testinngang"; byte [] resultat = originalInput.getBytes (); assertEquals (originalInput.length (), result.length);
Det er bedre å gi koding også og ikke avhenge av standard koding, da det er systemavhengig:
Streng originalInput = "testinngang"; byte [] resultat = originalInput.getBytes (StandardCharsets.UTF_16); assertTrue (originalInput.length () <result.length);
Hvis vår streng er Base64 kodet, kan vi bruke Base64 dekoder:
Streng originalInput = "dGVzdCBpbnB1dA =="; byte [] resultat = Base64.getDecoder (). dekode (originalInput); assertEquals ("testinngang", ny streng (resultat));
Vi kan også bruke DatatypeConverter parseBase64Binary () metode:
Streng originalInput = "dGVzdCBpbnB1dA =="; byte [] resultat = DatatypeConverter.parseBase64Binary (originalInput); assertEquals ("testinngang", ny streng (resultat));
Til slutt kan vi konvertere en heksadesimal String til en byte [] ved hjelp av DatatypeConverter metode:
Streng originalInput = "7465737420696E707574"; byte [] resultat = DatatypeConverter.parseHexBinary (originalInput); assertEquals ("testinngang", ny streng (resultat));
5. Konklusjon
Denne artikkelen forklarte det grunnleggende om hvordan du gjør Base64-koding og dekoding i Java ved hjelp av de nye API-ene som ble introdusert i Java 8 og Apache Commons.
Til slutt er det noen få andre APIer det er verdt å nevne som gir lignende funksjonalitet: java.xml.bind.DataTypeConverter med printHexBinary og parseBase64Binary.
Kodebiter finner du på GitHub.