Java Base64-codering en decodering

1. Overzicht

In deze zelfstudie verkennen we de verschillende hulpprogramma's die Base64-coderings- en decoderingsfunctionaliteit in Java bieden.

We gaan voornamelijk de nieuwe Java 8-API's en de hulpprogramma-API's die uit Apache Commons komen, illustreren.

2. Java 8 voor Base 64

Java 8 heeft eindelijk Base64-mogelijkheden toegevoegd naar de standaard API. Dit is via de java.util.Base64 hulpprogramma klasse.

Laten we beginnen met het bekijken van een basiscoderingsproces.

2.1. Java 8 Basic Base64

De basis-encoder houdt de zaken eenvoudig en codeert de invoer zoals deze is, zonder enige lijnscheiding.

De uitvoer wordt toegewezen aan een set tekens in A-Za-z0-9 + / tekenset, en de decoder verwerpt elk teken buiten deze set.

Laten we eerst codeer een eenvoudige String:

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

Merk op hoe we de volledige Encoder API ophalen via de simple getEncoder () hulpprogramma methode.

Laten we nu die String terug decoderen naar de oorspronkelijke vorm:

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

2.2. Java 8 Base64-codering zonder opvulling

In Base64-codering moet de lengte van de uitvoergecodeerde tekenreeks een veelvoud van drie zijn. Als dit niet het geval is, wordt de uitvoer opgevuld met extra pad-tekens (=).

Bij het decoderen worden deze extra opvullingstekens verwijderd. Bekijk dit gedetailleerde antwoord op Stack Overflow om dieper in opvulling in Base64 te duiken.

Als het nodig is sla de opvulling van de uitvoer over - misschien omdat de resulterende String nooit zal worden gedecodeerd - we kunnen er gewoon voor kiezen coderen zonder opvulling:

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

2.3. Java 8 URL-codering

URL-codering lijkt erg op de basiscodering die we hierboven hebben bekeken. Het gebruikt de URL en Bestandsnaam Safe Base64-alfabet en voegt geen lijnscheiding toe:

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

Het decoderen gebeurt op vrijwel dezelfde manier. De getUrlDecoder () utility methode retourneert een java.util.Base64.Decoder die vervolgens wordt gebruikt om de URL te decoderen:

byte [] decodedBytes = Base64.getUrlDecoder (). decode (encodedUrl); String decodedUrl = nieuwe String (decodedBytes); 

2.4. Java 8 MIME-codering

Laten we beginnen met het genereren van een aantal eenvoudige MIME-invoer om te coderen:

private statische StringBuilder getMimeBuffer () {StringBuilder buffer = nieuwe StringBuilder (); for (int count = 0; count <10; ++ count) {buffer.append (UUID.randomUUID (). toString ()); } retourbuffer; }

De MIME-encoder genereert een Base64-gecodeerde uitvoer met behulp van het basisalfabet maar in een MIME-vriendelijk formaat.

Elke regel van de uitvoer is niet langer dan 76 tekens en eindigt met een regelterugloop gevolgd door een regelinvoer (\ r \ n):

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

De getMimeDecoder () utility-methode retourneert een java.util.Base64.Decoder die vervolgens wordt gebruikt in het decoderingsproces:

byte [] decodedBytes = Base64.getMimeDecoder (). decode (encodedMime); String decodedMime = nieuwe String (decodedBytes); 

3. Codering / decodering met behulp van Apache Commons-code

Eerst moeten we de commons-codec-afhankelijkheid in het pom.xml:

 commons-codec commons-codec 1.10 

Merk op dat we kunnen controleren of er nieuwere versies van de bibliotheek zijn vrijgegeven op Maven Central.

De belangrijkste API is de org.apache.commons.codec.binary.Base64 class, die kan worden geparametriseerd met verschillende constructors:

  • Base64 (boolean urlSafe) maakt de Base64 API aan door de URL-veilige modus te besturen - aan of uit.
  • Base64(int lineLength) maakt de Base64 API aan in een URL-onveilige modus en bepaalt de lengte van de regel (standaard is 76).
  • Base64 (int lineLength, byte [] lineSeparator) maakt de Base64 API aan door een extra lijnscheidingsteken te accepteren, dat standaard CRLF ("\ r \ n") is.

Zodra de Base64 API is gemaakt, zijn zowel codering als decodering vrij eenvoudig:

String originalInput = "testinvoer"; Base64 base64 = nieuwe Base64 (); String encodedString = nieuwe String (base64.encode (originalInput.getBytes ())); 

De decoderen() methode van Base64 class geeft de gedecodeerde string terug:

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

Een andere eenvoudige optie is met behulp van de statische API van Base64in plaats van een instantie te maken:

String originalInput = "testinvoer"; String encodedString = nieuwe String (Base64.encodeBase64 (originalInput.getBytes ())); String decodedString = nieuwe String (Base64.decodeBase64 (encodedString.getBytes ()));

4. Omzetten van een Draad naar een byte Array

Soms moeten we een Draad naar een byte[]. De eenvoudigste manier om dit te doen, is door DraadgetBytes () methode:

String originalInput = "testinvoer"; byte [] resultaat = originalInput.getBytes (); assertEquals (originalInput.length (), result.length);

Het is beter om ook codering aan te bieden en niet afhankelijk te zijn van de standaardcodering, omdat het systeemafhankelijk is:

String originalInput = "testinvoer"; byte [] resultaat = originalInput.getBytes (StandardCharsets.UTF_16); assertTrue (originalInput.length () <resultaat.lengte);

Als onze String is Base64 gecodeerd, kunnen we gebruiken de Base64 decoder:

String originalInput = "dGVzdCBpbnB1dA =="; byte [] resultaat = Base64.getDecoder (). decode (originalInput); assertEquals ("test input", nieuwe String (resultaat));

We kunnen ook gebruik maken van DatatypeConverter parseBase64Binary () methode:

String originalInput = "dGVzdCBpbnB1dA =="; byte [] resultaat = DatatypeConverter.parseBase64Binary (originalInput); assertEquals ("test input", new String (resultaat));

Ten slotte kunnen we een hexadecimaal converteren Draad naar een byte[] gebruik makend van Datatype Converter methode:

String originalInput = "7465737420696E707574"; byte [] resultaat = DatatypeConverter.parseHexBinary (originalInput); assertEquals ("test input", new String (resultaat));

5. Conclusie

In dit artikel wordt de basis uitgelegd van hoe u Base64-codering en decodering in Java uitvoert met behulp van de nieuwe API's die zijn geïntroduceerd in Java 8 en Apache Commons.

Ten slotte zijn er een paar andere API's die het vermelden waard zijn en die vergelijkbare functionaliteit bieden: java.xml.bind.DataTypeConverter met printHexBinary en parseBase64Binary.

Codefragmenten zijn te vinden op GitHub.