Converteer String naar Byte Array en Reverse in Java

1. Inleiding

We moeten vaak converteren tussen Draad en byte array in Java. In deze tutorial zullen we deze bewerkingen in detail onderzoeken.

Eerst bekijken we verschillende manieren om een Draad naar een byte array. Vervolgens bekijken we vergelijkbare bewerkingen in omgekeerde volgorde.

2. Converteren Draad naar Byte Array

EEN Draad wordt opgeslagen als een array van Unicode-tekens in Java. Om het om te zetten naar een byte array, vertalen we de reeks tekens in een reeks bytes. Voor deze vertaling, we gebruiken een instantie van Tekenset. Deze klasse specificeert een afbeelding tussen een reeks chars en een reeks bytes.

We verwijzen naar het bovenstaande proces als codering.

We kunnen een Draad in een byte array in Java op meerdere manieren. Laten we ze allemaal in detail bekijken met voorbeelden.

2.1. Gebruik makend van String.getBytes ()

De Draad klasse biedt drie overbelast getBytes methoden om een Draad in een byte array:

  • getBytes () - codeert met behulp van de standaard tekenset van het platform
  • getBytes (String charsetName) - codeert met behulp van de benoemde karakterset
  • getBytes (Charset charset) - codeert met behulp van de meegeleverde tekenset

Ten eerste, laten we een string coderen met de standaard karakterset van het platform:

String inputString = "Hallo wereld!"; byte [] byteArrray = inputString.getBytes ();

De bovenstaande methode is platformafhankelijk omdat deze de standaard tekenset van het platform gebruikt. We kunnen deze tekenset krijgen door te bellen Charset.defaultCharset ().

Ten tweede, laten we een string coderen met een benoemde karakterset:

@Test public void whenGetBytesWithNamedCharset_thenOK () gooit UnsupportedEncodingException {String inputString = "Hallo wereld!"; String charsetName = "IBM01140"; byte [] byteArrray = inputString.getBytes ("IBM01140"); assertArrayEquals (nieuwe byte [] {-56, -123, -109, -109, -106, 64, -26, -106, -103, -109, -124, 90}, byteArrray); }

Deze methode gooit UnsupportedEncodingException als de genoemde tekenset niet wordt ondersteund.

Het gedrag van de bovenstaande twee versies is niet gedefinieerd als de invoer tekens bevat die niet worden ondersteund door de karakterset. De derde versie daarentegen gebruikt de standaard vervangende byte-array van de tekenset om niet-ondersteunde invoer te coderen.

De volgende, laten we de derde versie van de getBytes () methode en geef een instantie van Tekenset:

@Test public void whenGetBytesWithCharset_thenOK () {String inputString = "Hallo ਸੰਸਾਰ!"; Charset charset = Charset.forName ("ASCII"); byte [] byteArrray = inputString.getBytes (karakterset); assertArrayEquals (nieuwe byte [] {72, 101, 108, 108, 111, 32, 63, 63, 63, 63, 63, 33}, byteArrray); }

Hier gebruiken we de fabrieksmethode Tekenset.forName om een ​​instantie van het Tekenset. Deze methode genereert een runtime-uitzondering als de naam van de aangevraagde tekenset ongeldig is. Het genereert ook een runtime-uitzondering als de karakterset wordt ondersteund in de huidige JVM.

Sommige tekensets zijn echter gegarandeerd beschikbaar op elk Java-platform. De StandardCharsets class definieert constanten voor deze tekensets.

Tenslotte, laten we coderen met een van de standaard tekensets:

@Test public void whenGetBytesWithStandardCharset_thenOK () {String inputString = "Hallo wereld!"; Charset charset = StandardCharsets.UTF_16; byte [] byteArrray = inputString.getBytes (karakterset); assertArrayEquals (nieuwe byte [] {-2, -1, 0, 72, 0, 101, 0, 108, 0, 108, 0, 111, 0, 32, 0, 87, 0, 111, 0, 114, 0 , 108, 0, 100, 0, 33}, byteArrray); }

Zo voltooien we de beoordeling van de verschillende getBytes versies. Laten we vervolgens kijken naar de methode die wordt geboden door Tekenset zelf.

2.2. Gebruik makend van Tekenset.encode ()

De Tekenset klasse biedt coderen(), een handige methode die Unicode-tekens in bytes codeert. Deze methode vervangt altijd ongeldige invoer en niet-toewijsbare tekens met behulp van de standaard vervangende byte-array van de tekenset.

Laten we de coderen methode om een Draad in een byte matrix:

@Test public void whenEncodeWithCharset_thenOK () {String inputString = "Hallo ਸੰਸਾਰ!"; Charset charset = StandardCharsets.US_ASCII; byte [] byteArrray = charset.encode (inputString) .array (); assertArrayEquals (nieuwe byte [] {72, 101, 108, 108, 111, 32, 63, 63, 63, 63, 63, 33}, byteArrray); }

Zoals we hierboven kunnen zien, zijn niet-ondersteunde tekens vervangen door de standaardvervanging van de tekenset byte 63.

De benaderingen die tot nu toe zijn gebruikt, gebruiken de CharsetEncoder klasse intern om codering uit te voeren. Laten we deze klasse in de volgende sectie bekijken.

2.3. CharsetEncoder

CharsetEncoder transformeert Unicode-tekens in een reeks bytes voor een bepaalde tekenset. Bovendien biedt het een fijnmazige controle over het coderingsproces.

Laten we deze klasse gebruiken om een Draad in een byte matrix:

@Test public void whenUsingCharsetEncoder_thenOK () gooit CharacterCodingException {String inputString = "Hallo ਸੰਸਾਰ!"; CharsetEncoder encoder = StandardCharsets.US_ASCII.newEncoder (); encoder.onMalformedInput (CodingErrorAction.IGNORE) .onUnmappableCharacter (CodingErrorAction.REPLACE) .replaceWith (nieuwe byte [] {0}); byte [] byteArrray = encoder.encode (CharBuffer.wrap (inputString)) .array (); assertArrayEquals (nieuwe byte [] {72, 101, 108, 108, 111, 32, 0, 0, 0, 0, 0, 33}, byteArrray); }

Hier maken we een instantie van CharsetEncoder door het nieuwEncoder methode op een Tekenset voorwerp.

Vervolgens specificeren we acties voor foutcondities door de onMalformedInput () en onUnmappableCharacter () methoden. We kunnen de volgende acties specificeren:

  • NEGEREN - laat de foutieve invoer vallen
  • VERVANG - vervang de foutieve invoer
  • REPORT - rapporteer de fout door een CoderResult voorwerp of het gooien van een CharacterCodingException

Verder gebruiken we de vervangen door() methode om de vervanging te specificeren byte array.

Daarom voltooien we de beoordeling van verschillende benaderingen om een ​​string naar een byte-array te converteren. Laten we nu eens kijken naar de omgekeerde bewerking.

3. Omzetten Byte Array naar String

We verwijzen naar het proces van het converteren van een byte array naar een Draad net zo decodering. Net als bij codering, vereist dit proces een Tekenset.

We kunnen echter niet zomaar een karakterset gebruiken voor het decoderen van een byte-array. We zouden de karakterset moeten gebruiken die werd gebruikt om het Draad in de byte array.

We kunnen een byte-array op veel manieren naar een string converteren. Laten we ze allemaal in detail bekijken.

3.1. De ... gebruiken Draad Constructor

De Draad klasse heeft weinig constructors die een byte array als invoer. Ze zijn allemaal vergelijkbaar met de getBytes methode maar werk in omgekeerde volgorde.

Eerste, laten we een byte-array converteren naar Draad met behulp van de standaard tekenset van het platform:

@Test openbare leegte whenStringConstructorWithDefaultCharset_thenOK () {byte [] byteArrray = {72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33}; String string = nieuwe String (byteArrray); assertNotNull (string); }

Merk op dat we hier niets beweren over de inhoud van de gedecodeerde string. Dit komt omdat het kan decoderen naar iets anders, afhankelijk van de standaard tekenset van het platform.

Om deze reden moeten we deze methode over het algemeen vermijden.

Ten tweede, laten we een benoemde tekenset gebruiken voor het decoderen:

@Test openbare leegte whenStringConstructorWithNamedCharset_thenOK () gooit UnsupportedEncodingException {String charsetName = "IBM01140"; byte [] byteArrray = {-56, -123, -109, -109, -106, 64, -26, -106, -103, -109, -124, 90}; String string = nieuwe String (byteArrray, charsetName); assertEquals ("Hallo wereld!", string); }

Deze methode genereert een uitzondering als de benoemde tekenset niet beschikbaar is op de JVM.

Ten derde, laten we een Tekenset bezwaar tegen decodering:

@Test openbare leegte whenStringConstructorWithCharSet_thenOK () {Charset charset = Charset.forName ("UTF-8"); byte [] byteArrray = {72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33}; String string = nieuwe String (byteArrray, charset); assertEquals ("Hallo wereld!", string); }

Tenslotte, laten we een standaard gebruiken Tekenset voor het zelfde:

@Test openbare leegte whenStringConstructorWithStandardCharSet_thenOK () {Charset charset = StandardCharsets.UTF_16; byte [] byteArrray = {-2, -1, 0, 72, 0, 101, 0, 108, 0, 108, 0, 111, 0, 32, 0, 87, 0, 111, 0, 114, 0, 108, 0, 100, 0, 33}; String string = nieuwe String (byteArrray, charset); assertEquals ("Hallo wereld!", string); }

Tot nu toe hebben we een byte array in een Draad met behulp van de constructor. Laten we nu eens kijken naar de andere benaderingen.

3.2. Gebruik makend van Charset.decode ()

De Tekenset klasse biedt de decoderen() methode die een ByteBuffer naar Draad:

@Test public void whenDecodeWithCharset_thenOK () {byte [] byteArrray = {72, 101, 108, 108, 111, 32, -10, 111, 114, 108, -63, 33}; Charset charset = StandardCharsets.US_ASCII; String string = charset.decode (ByteBuffer.wrap (byteArrray)) .toString (); assertEquals ("Hallo  orl !", string); }

Hier, de ongeldige invoer wordt vervangen door het standaard vervangende teken voor de karakterset.

3.3. CharsetDecoder

Alle voorgaande benaderingen voor het intern decoderen gebruiken de CharsetDecoder klasse. We kunnen deze klasse direct gebruiken voor fijnmazige controle over het decoderingsproces:

@Test public void whenUsingCharsetDecoder_thenOK () gooit CharacterCodingException {byte [] byteArrray = {72, 101, 108, 108, 111, 32, -10, 111, 114, 108, -63, 33}; CharsetDecoder decoder = StandardCharsets.US_ASCII.newDecoder (); decoder.onMalformedInput (CodingErrorAction.REPLACE) .onUnmappableCharacter (CodingErrorAction.REPLACE) .replaceWith ("?"); String string = decoder.decode (ByteBuffer.wrap (byteArrray)) .toString (); assertEquals ("Hallo? orl ?!", string); }

Hier vervangen we ongeldige invoer en niet-ondersteunde tekens door "?".

Als we geïnformeerd willen worden in geval van ongeldige invoer, kunnen we de decoder net zo:

decoder.onMalformedInput (CodingErrorAction.REPORT) .onUnmappableCharacter (CodingErrorAction.REPORT)

4. Conclusie

In dit artikel hebben we verschillende manieren onderzocht om te converteren Draad naar een byte-array en omgekeerd. We moeten de juiste methode kiezen op basis van de invoergegevens en het vereiste controleniveau voor ongeldige invoer.

Zoals gewoonlijk is de volledige broncode te vinden op GitHub.


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