Java Base64-kodning og afkodning

1. Oversigt

I denne vejledning udforsker vi de forskellige hjælpeprogrammer, der giver Base64-kodnings- og dekodningsfunktionalitet i Java.

Vi vil hovedsagelig illustrere de nye Java 8 API'er og hjælpeprogrammerne API'er, der kommer ud af Apache Commons.

2. Java 8 til Base 64

Java 8 har endelig tilføjet Base64-funktioner til standard API. Dette er via java.util.Base64 utility klasse.

Lad os starte med at se på en grundlæggende encoderproces.

2.1. Java 8 Basic Base64

Den grundlæggende koder holder tingene enkle og koder input som det er uden linjeseparation.

Outputtet kortlægges til et sæt tegn i A-Za-z0-9 + / tegnsæt, og dekoderen afviser ethvert tegn uden for dette sæt.

Lad os først kode en simpel streng:

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

Bemærk, hvordan vi henter den fulde Encoder API via det enkle getEncoder () hjælpemetode.

Lad os nu afkode den streng tilbage til den oprindelige form:

byte [] decodedBytes = Base64.getDecoder (). decode (encodedString); String decodedString = ny String (decodedBytes);

2.2. Java 8 Base64-kodning uden polstring

I Base64-kodning skal længden af ​​output-kodet streng være et multiplum af tre. Hvis ikke, vil outputen blive polstret med yderligere pad-tegn (=).

Ved afkodning kasseres disse ekstra polstringstegn. For at grave dybere ned i polstring i Base64 skal du tjekke dette detaljerede svar på Stack Overflow.

Hvis vi har brug for det spring over polstringen af ​​output - måske fordi den resulterende streng aldrig bliver afkodet tilbage - kan vi simpelthen vælge at kode uden polstring:

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

2.3. Java 8 URL-kodning

URL-kodning svarer meget til den grundlæggende encoder, vi kiggede på ovenfor. Det bruger URL og filnavn Safe Base64 alfabet og tilføjer ikke linjeseparation:

Streng originalUrl = "//www.google.co.nz/?gfe_rd=cr&ei=dzbFV&gws_rd=ssl#q=java"; Streng kodetUrl = Base64.getUrlEncoder (). EncodeToString (originalURL.getBytes ()); 

Afkodning sker stort set på samme måde. Det getUrlDecoder () hjælpemetode returnerer a java.util.Base64.Decoder der derefter bruges til at afkode URL:

byte [] decodedBytes = Base64.getUrlDecoder (). afkode (kodetUrl); String decodedUrl = ny String (decodedBytes); 

2.4. Java 8 MIME-kodning

Lad os starte med at generere nogle grundlæggende MIME-input til kodning:

privat statisk StringBuilder getMimeBuffer () {StringBuilder buffer = ny StringBuilder (); for (int count = 0; count <10; ++ count) {buffer.append (UUID.randomUUID (). toString ()); } returner buffer }

MIME-koderen genererer et Base64-kodet output ved hjælp af det grundlæggende alfabet, men i et MIME-venligt format.

Hver linje i output er ikke længere end 76 tegn og slutter med en vognretur efterfulgt af en linefeed (\ r \ n):

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

Det getMimeDecoder () hjælpemetode returnerer a java.util.Base64.Decoder der derefter bruges i afkodningsprocessen:

byte [] decodedBytes = Base64.getMimeDecoder (). afkode (encodedMime); String decodedMime = new String (decodedBytes); 

3. Kodning / afkodning ved hjælp af Apache Commons-kode

For det første skal vi definere afhængighed af commons-codec i pom.xml:

 commons-codec commons-codec 1.10 

Bemærk, at vi kan kontrollere, om nyere versioner af biblioteket er frigivet på Maven Central.

Den vigtigste API er org.apache.commons.codec.binary.Base64 klasse, som kan parametriseres med forskellige konstruktører:

  • Base64 (boolsk urlSafe) opretter Base64 API ved at kontrollere den URL-sikre tilstand - til eller fra.
  • Base64(int lineLength) opretter Base64 API i en URL-usikker tilstand og styrer længden af ​​linjen (standard er 76).
  • Base64 (int lineLength, byte [] lineSeparator) opretter Base64 API ved at acceptere en ekstra linjeseparator, som som standard er CRLF (“\ r \ n”).

Når Base64 API er oprettet, er både kodning og afkodning ret enkel:

Streng originalInput = "testindgang"; Base64 base64 = ny Base64 (); Streng kodetString = ny streng (base64.encode (originalInput.getBytes ())); 

Det afkode () metode til Base64 klasse returnerer den afkodede streng:

String decodedString = ny String (base64.decode (encodedString.getBytes ())); 

En anden enkel mulighed er ved hjælp af den statiske API af Base64i stedet for at oprette en forekomst:

Streng originalInput = "testindgang"; Streng encodedString = ny streng (Base64.encodeBase64 (originalInput.getBytes ())); String decodedString = new String (Base64.decodeBase64 (encodedString.getBytes ());

4. Konvertering af en Snor til en byte Array

Nogle gange er vi nødt til at konvertere en Snor til en byte []. Den enkleste måde at gøre dette på er at bruge SnorgetBytes () metode:

Streng originalInput = "testindgang"; byte [] resultat = originalInput.getBytes (); assertEquals (originalInput.length (), result.length);

Det er bedre at give kodning så godt og ikke afhænge af standardkodning, da det er systemafhængigt:

Streng originalInput = "testindgang"; byte [] resultat = originalInput.getBytes (StandardCharsets.UTF_16); assertTrue (originalInput.length () <result.length);

Hvis vores streng er Base64 kodet, kan vi bruge Base64 dekoder:

Streng originalInput = "dGVzdCBpbnB1dA =="; byte [] resultat = Base64.getDecoder (). afkode (originalInput); assertEquals ("test input", ny streng (resultat));

Vi kan også bruge DatatypeConverter parseBase64Binary () metode:

Streng originalInput = "dGVzdCBpbnB1dA =="; byte [] resultat = DatatypeConverter.parseBase64Binary (originalInput); assertEquals ("test input", ny streng (resultat));

Endelig kan vi konvertere en hexadecimal Snor til en byte [] ved brug af Datatype konverter metode:

Streng originalInput = "7465737420696E707574"; byte [] resultat = DatatypeConverter.parseHexBinary (originalInput); assertEquals ("test input", ny streng (resultat));

5. Konklusion

Denne artikel forklarede det grundlæggende om, hvordan man laver Base64-kodning og afkodning i Java ved hjælp af de nye API'er, der blev introduceret i Java 8 og Apache Commons.

Endelig er der et par andre API'er, der er værd at nævne, der giver lignende funktionalitet: java.xml.bind.DataTypeConverter med printHexBinary og parseBase64Binary.

Kodestykker kan findes på GitHub.