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.