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.


$config[zx-auto] not found$config[zx-overlay] not found