2017-06-08 5 views
0

Je suis un tableau d'octets envoyé de javascript par ajax qui ressemble à ceci:Java convertir la chaîne de tableau d'octets tableau d'octets

"89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,01,98,00,00,00,e4,08,06,00 ..." 

Je voudrais convertir cette chaîne à un tableau d'octets. assez similaire à cette question, mais en utilisant Java à la place: Convert String[] to byte[] array

Edit: Cela semble fonctionner - mais pas sûr si je fais droit

String[] byteData ="89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,01,98,00,00,00,e4,08,06,00"; 
    byte[] b = new byte[byteData.length]; 
    for (int i = 0; i < byteData.length; i++) { 
     BigInteger bla = BigInteger.valueOf(Integer.parseInt(byteData[i].trim(), 16) - 128); 
     b[i] = bla.toByteArray()[0]; 
    } 
+2

Avez-vous essayé du code vous-même? – ItamarG3

+0

Vous avez ['String (byte []')] (https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#String (byte [])), vous venez de besoin de lire la chaîne pour décoder les octets un par un pour créer ce 'byte []', essayez et revenez si vous ne pouvez pas. – AxelH

+2

Le processus général serait de 'String :: split' à la virgule, écrire une fonction' hexToDec() 'de conversion, soustraire 128 du résultat, puis lancer' byte'. Il n'y a pas de 'uByte' en Java, c'est pourquoi vous devez soustraire 128 du résultat – CraigR8806

Répondre

0

ici est une solution simple avec JAVA:

 String bytes="89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,01,98,00,00,00,e4,08"; 
     String []tab=bytes.split(","); 
     Integer []b = new Integer[tab.length]; 
     for(int i = 0 ; i < tab.length ; i++){ 
      if(tab[i].matches("[-+]?\\d*\\.?\\d+")) 
       b[i]=Integer.parseInt(tab[i]); 
      else 
       b[i]=Integer.parseInt(tab[i],16); 


     } 
+0

java.lang.NumberFormatException: Pour la chaîne d'entrée:" 4e "at' b [i] = Byte.parseByte (tab [i]); ' – sofarsoghood

+0

j'ai édité la réponse, ceci résoudra le problème:' b [i] = Byte.parseByte (étiquette [i], 16); ' –

+0

Malheureusement ce problème de cause:' Exception dans le fil "principal" java.lang.NumberFormatException: Valeur hors de portée. Valeur: "89" Radix: 16' – tmucha

0

EDIT: en fait parseByte ne semble pas être un choix sûr pour votre cas en raison de this, donc je pris l'inspiration de this answer pour le changer.

Vous pouvez faire:

String bytesAsStringWithCommas = "89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,01,98,00,00,00,e4,08,06,00 ..."; 
String[] bytesStr = bytesAsStringWithCommas.split(","); 
byte[] byteArray = new byte[bytesStr.length]; 
for (int j = 0; j < bytesStr.length; j++) { 
    byteArray[j] = (byte) ((Character.digit(bytesStr[j].charAt(0), 16) << 4) + Character.digit(bytesStr[j].charAt(1), 16)); 
} 

Vous devriez probablement changer votre code serveur ou code client pour envoyer des données directement au lieu d'utiliser des solutions alambiquées comme celui-ci. Ou vous pouvez également utiliser l'encodage Base64, qui sera déjà meilleur que votre solution actuelle.

+1

'parseByte' nécessite le 2ème argument 16. – saka1029

+0

Vous avez parfaitement raison, merci. Mais j'ai trouvé que parseByte n'est pas un très bon choix en fait (voir edit). –

0

Vous pouvez essayer cette

String response ="89,50,47,00,00,00,49,48,44,52,00,00,01,98,00,00,00,08"; 

List<Byte> byteList = Arrays.stream(response.split(",")) 
    .map(Byte::parseByte) 
    .collect(Collectors.toList()); 

Identique au précédent mais avec flux xD

mais votre exemple jette NumberFormatException sur 4E, 0d et ainsi de suite

+0

OP veut un tableau d'octets, pas un 'Liste ' –

+0

eehm NumberFormatException xD – sofarsoghood

+0

@JacobG. vous pouvez utiliser .toArray (Byte [] :: new) au lieu de .collect (Collectors.toList()) –

0

Essayez ci-dessous le code (sortie est le résultat de conversion):

String input = "89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,01,98,00,00,00,e4,08"; 

    String[] hex = input.split(","); 
    char[] chars = new char[hex.length]; 
    for (int i = 0; i < hex.length; i++) { 
     chars[i] = (char) Integer.parseInt(hex[i], 16); 
    } 
    String output = new String(chars);