Question Comment convertir un tableau d'octets en une chaîne hexadécimale en Java?


J'ai un tableau d'octets rempli de nombres hexadécimaux et son impression est simple, car il y a beaucoup d'éléments non imprimables. Ce dont j'ai besoin est le code hexadécimal exact sous la forme de: 3a5f771c


507
2018-03-11 13:06


origine


Réponses:


De la discussion ici, et particulièrement ce répondez, c'est la fonction que j'utilise actuellement:

private final static char[] hexArray = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    for ( int j = 0; j < bytes.length; j++ ) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    return new String(hexChars);
}

Mes propres petits tests (un million d'octets mille fois, 256 octets 10 millions de fois) ont montré qu'il était beaucoup plus rapide que toute autre alternative, environ la moitié du temps sur les tableaux longs. Par rapport à la réponse que j'ai reçue, passer aux opérations binaires - comme suggéré dans la discussion - réduit d'environ 20% le temps consacré aux tableaux longs. (Edit: Quand je dis que c'est plus rapide que les alternatives, je veux dire le code alternatif proposé dans les discussions. Performance est équivalent à Commons Codec, qui utilise un code très similaire.)


737
2018-03-24 20:32



le Apache Commons Codec la bibliothèque a Hex classe pour faire ce type de travail.

import org.apache.commons.codec.binary.Hex;

String foo = "I am a string";
byte[] bytes = foo.getBytes();
System.out.println( Hex.encodeHexString( bytes ) );

327
2018-03-11 13:18



Utilisation DatatypeConverter.printHexBinary(). Vous pouvez lire sa documentation dans http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/DatatypeConverter.html

Par exemple:

byte bytes[] = {(byte)0, (byte)0, (byte)134, (byte)0, (byte)61};
System.out.println(javax.xml.bind.DatatypeConverter.printHexBinary(bytes));

Aura pour résultat:

000086003D

Comme vous pouvez le voir, cela récupérera la chaîne hexadécimale représentant le tableau d'octets avec des zéros non significatifs.

Cette réponse est fondamentalement la même que dans la question En Java, comment convertir un tableau d'octets en une chaîne de chiffres hexadécimaux tout en conservant des zéros?


289
2018-02-24 15:37



Solution la plus simple, pas de librairies externes, pas de constantes de chiffres:

public static String byteArrayToHex(byte[] a) {
   StringBuilder sb = new StringBuilder(a.length * 2);
   for(byte b: a)
      sb.append(String.format("%02x", b));
   return sb.toString();
}

182
2017-10-22 07:38



Une solution de goyave, pour l'exhaustivité:

import com.google.common.io.BaseEncoding;
...
byte[] bytes = "Hello world".getBytes(StandardCharsets.UTF_8);
final String hex = BaseEncoding.base16().lowerCase().encode(bytes);

À présent hex est "48656c6c6f20776f726c64".


41
2018-04-07 13:34



Cet oneliner simple fonctionne pour moi
String result = new BigInteger(1, inputBytes).toString(16);  
EDIT - Utiliser ceci va supprimer les zéros en tête, mais ils ont travaillé pour mon cas d'utilisation. Merci @Voicu pour l'avoir signalé


37
2017-11-04 15:30



Utiliser la classe DataTypeConverterjavax.xml.bind.DataTypeConverter

String hexString = DatatypeConverter.printHexBinary(bytes[] raw);


20
2018-05-12 13:43