2010-01-13 4 views
2

Je suis tenté de convertir un ensemble de chaînes en un tableau byte []. Au début, je fais quelque chose comme ça pour convertir un tableau d'octets à une chaîne:Conversion d'un ensemble de chaînes en un tableau byte []

public String convertByte(byte[] msg) { 
    String str = "";   
    for(int i = 0; i < msg.length; i++) { 
     str += (msg[i] + " * "); 
    }  
    return str; 
} 

Lorsque je tente de reconvertir à l'octet [] tableau, je ne reçois pas les mêmes valeurs que celles Converti à une chaîne. Au départ, quelque chose m'avait donné des valeurs incorrectes.

Je suis actuellement en train quelque chose le long des lignes de:

public static byte[] convertStr(String ln) 
{ 
    System.out.println(ln); 

    String[] st = ln.split(" * "); 
    byte[] byteArray = new byte[23]; 
    for(int i = 0; i < st.length; i++) 
    { 
     byteArray[i] = st[i].get byte value or something; 
    } 

    return byteArray; 
} 

Si je tente d'utiliser la méthode GetBytes() de la chaîne api, elle retourne un tableau d'octets plutôt qu'un octet, ce qui est mon problème .

Toute aide serait grandement appréciée.

+1

Quel est le problème avec getBytes()? Vous obtenez un tableau d'octets, mais c'est ce que vous voulez, ou pas? Vous ne pouvez pas convertir une chaîne en un seul octet, car un octet est plus petit que la plupart des chaînes ... – Fortega

Répondre

0

Je ne comprends pas pourquoi vous essayez d'obtenir ces octets par caractères. getBytes() et ses variantes vous donneront un tableau byte [] pour la chaîne entière à la fois. Cependant, si vous voulez voir comment les caractères sont codés, votre approche peut être bonne, mais vous devez garder à l'esprit qu'un seul caractère pourrait être encodé, p. Ex. un à quatre octets dans certains encodages, vous avez donc besoin d'un tableau d'octets pour chaque caractère.

2

Cela devrait fonctionner:

byte[] bytes = "Hello World".getBytes("UTF-8"); 
String hello = new String(bytes, "UTF-8"); 

L'exemple ci-dessus utilise l'encodage UTF-8 et sert comme un exemple. Utilisez l'encodage de caractères que vous attendez dans votre saisie de message. (Cette « réponse » n'a pas été une réponse à la question ...)

Modifier

Nous avons donc besoin d'une conversion d'octet [] à chaîne et retour à l'octet []. me123 a ajouté des délimiteurs entre (et devant) les valeurs. Comme d'autres déjà expliqué, 1. l'expression rationnelle de la scission doit être " \\* " et 2. la méthode magique est Byte.parseByte(st[i])

Voici une alternative sans utiliser un séparateur, mais une largeur fixe pour les entrées d'octets. Le convertisseur StringToByte affiche une solution assez rapide basée uniquement sur le tableau de chaînes de caractères.

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

public static byte[] convertStr(String ln) 
{ 
    System.out.println(ln); 
    char[] chars = ln.toCharArray(); 
    byte[] result = new byte[ln.length()/2]; 
    for (int i = 0;i < result.length; i++) { 
     result[i] = (byte) hexToInt(chars[2*i], chars[2*i+1]); 
    } 

    return result; 
} 

private static int hexToInt(char c1, char c2) { 
    return ((c1 <= '9' ? c1 - '0':c1 - 'a'+10) << 4) 
      + (c2 <= '9' ? c2 - '0':c2 - 'a'+10); 
} 
+0

Il veut convertir un ensemble de chaînes en un tableau d'octets, pas une seule chaîne. – Fortega

+1

Non, cela ne fonctionnera pas car il utilise sa propre fonction pour convertir le tableau d'octets en une chaîne, par ex. {0, 1, 2, 3} -> "0 * 1 * 2 * 3 *" – jarnbjo

+0

Stupide moi, oui vous avez raison - réponse correcte pour un problème totalement différent;) thx pour l'indice. –

0

Si vous êtes certain que la chaîne sera assez petit pour tenir dans un octet, vous pourriez faire

st[i].getBytes()[0]; 

Cependant, dans la plupart des cas, votre chaîne sera probablement plus grand, donc en ces cas, il n'est pas possible ...

2

L'utilisation de Byte.parseByte peut vous aider à faire votre deuxième extrait de travail. Mais, sauf si vous avez des raisons spécifiques d'utiliser ce type de représentation, je coderais des chaînes de caractères en octets en utilisant les méthodes Java mentionnées dans d'autres réponses.

public static byte[] convertStr(String ln) 
{ 
    System.out.println(ln); 

    String[] st = ln.split(" * "); 
    byte[] byteArray = new byte[23]; 
    for(int i = 0; i < st.length; i++) 
    { 
     byteArray[i] = Byte.parseByte(st[i]); 
    } 

    return byteArray; 
} 
0

Si vous êtes sûr que la chaîne contient 1 octet, vous pouvez le faire:

byteArray[i] = st[i].getbytes()[0]; 
0

HEXTOINT devrait être comme ça

private static int hexToInt(char c1, char c2) { 
    return (Character.digit(c1, 16) << 4) + Character.digit(c2, 16); 
} 

Sinon CA retourne AA dans l'octet.

Questions connexes