web-dev-qa-db-fra.com

Comment convertir des chaînes hexadécimales en valeurs d'octets dans Java

J'ai un tableau de chaînes. Je veux le convertir en tableau d'octets. J'utilise le programme Java. Par exemple:

String str[] = {"aa", "55"};

convertir en:

byte new[] = {(byte)0xaa, (byte)0x55};

Que puis-je faire?

22
brian

En regardant l'exemple, je suppose que vous voulez dire qu'un tableau de chaînes est en fait un tableau de représentation HEX d'octets, n'est-ce pas?

Si oui, alors pour chaque élément de chaîne, je ferais ce qui suit:

  1. vérifier qu'une chaîne ne comprend que 2 caractères
  2. ces caractères sont dans l'intervalle '0' .. '9' ou 'a' .. 'f' (prenez également en compte leur cas)
  3. convertir chaque caractère en un nombre correspondant, en soustrayant la valeur de code "0" ou "a"
  4. construire une valeur d'octet, où le premier caractère est des bits plus élevés et le second caractère est les bits inférieurs. Par exemple.

    int byteVal = (firstCharNumber << 4) | secondCharNumber;
    
15
Wizart
String str = "Your string";

byte[] array = str.getBytes();
54
Lion

Convertissez la chaîne en Byte-Array:

byte[] theByteArray = stringToConvert.getBytes();

Convertir une chaîne en octet:

 String str = "aa";

 byte b = Byte.valueOf(str);
11
Paresh Mayani

Vous pouvez essayer quelque chose de similaire à ceci:

String s = "65";

byte value = Byte.valueOf(s);

Utilisez la méthode Byte.ValueOf() pour tous les éléments du tableau String pour les convertir en valeurs d'octets.

9
Mithun Sasidharan

Puisqu'il n'y avait pas de réponse pour conversion de chaîne hexadécimale en octet unique, voici la mienne:

private static byte hexStringToByte(String data) {
    return (byte) ((Character.digit(data.charAt(0), 16) << 4)
                  | Character.digit(data.charAt(1), 16));
}

Exemple d'utilisation:

hexStringToByte("aa"); // 170
hexStringToByte("ff"); // 255
hexStringToByte("10"); // 16

Ou vous pouvez également essayer la Integer.parseInt(String number, int radix) imo, bien meilleure que les autres.

// first parameter is a number represented in string
// second is the radix or the base number system to be use
Integer.parseInt("de", 16); // 222
Integer.parseInt("ad", 16); // 173
Integer.parseInt("c9", 16); // 201
3
mr5

Un long chemin à parcourir :). Je ne connais pas les méthodes pour se débarrasser des longues instructions for

ArrayList<Byte> bList = new ArrayList<Byte>();
for(String ss : str) {
    byte[] bArr = ss.getBytes();
    for(Byte b : bArr) {
        bList.add(b);
    }
}
//if you still need an array
byte[] bArr = new byte[bList.size()];
for(int i=0; i<bList.size(); i++) {
    bArr[i] = bList.get(i);
}
3
suat
String source = "testString";
byte[] byteArray = source.getBytes(encoding); 

Vous pouvez foreach et faire la même chose avec toutes les chaînes du tableau.

2
Sandeep Pathak

La manière la plus simple (en utilisant Apache Common Codec):

byte[] bytes = Hex.decodeHex(str.toCharArray());
0
ANTARA

Ici, si vous convertissez une chaîne en octet []. Il existe un code utilitaire:

    String[] str = result.replaceAll("\\[", "").replaceAll("\\]","").split(", ");
    byte[] dataCopy = new byte[str.length] ;
    int i=0;
    for(String s:str ) {
        dataCopy[i]=Byte.valueOf(s);
        i++;
    }
    return dataCopy;
0
user3396256
String str[] = {"aa", "55"};

byte b[] = new byte[str.length];

for (int i = 0; i < str.length; i++) {
    b[i] = (byte) Integer.parseInt(str[i], 16);
}

Integer.parseInt (string, radix) convertit une chaîne en entier, le paramètre radix spécifie le système numérique.

Utilisez un radix de 16 si la chaîne représente un nombre hexadécimal.
Utilisez un radix de 2 si la chaîne représente un nombre binaire.
Utilisez une radix de 10 (ou omettez le paramètre radix) si la chaîne représente un nombre décimal.

Pour plus de détails, consultez les documents Java Java: https://docs.Oracle.com/javase/7/docs/api/Java/lang/Integer.html#parseInt (Java .lang.String,% 20int)

0
h3k