Comment convertir Java String en octet []?


539

Existe-t-il un moyen de convertir Java Stringen byte[]( pas la boîte Byte[])?

En essayant ceci:

System.out.println(response.split("\r\n\r\n")[1]);
System.out.println("******");
System.out.println(response.split("\r\n\r\n")[1].getBytes().toString());

et je reçois des sorties séparées. Impossible d'afficher la première sortie car il s'agit d'une chaîne gzip.

<A Gzip String>
******
[B@38ee9f13

Le second est une adresse. Y a-t-il quelque chose que je fais mal? J'ai besoin du résultat dans un byte[]pour le nourrir au décompresseur gzip, qui est le suivant.

String decompressGZIP(byte[] gzip) throws IOException {
    java.util.zip.Inflater inf = new java.util.zip.Inflater();
    java.io.ByteArrayInputStream bytein = new java.io.ByteArrayInputStream(gzip);
    java.util.zip.GZIPInputStream gzin = new java.util.zip.GZIPInputStream(bytein);
    java.io.ByteArrayOutputStream byteout = new java.io.ByteArrayOutputStream();
    int res = 0;
    byte buf[] = new byte[1024];
    while (res >= 0) {
        res = gzin.read(buf, 0, buf.length);
        if (res > 0) {
            byteout.write(buf, 0, res);
        }
    }
    byte uncompressed[] = byteout.toByteArray();
    return (uncompressed.toString());
}


Désolé, j'essaie de convertir une chaîne en bytearray et en arrière et d'obtenir un mauvais résultat. Je vais le modifier dans un moment et revenir.
Mkl Rjv

9
Votre problème est qu'il String.getBytes()retourne en effet un tableau d'octets, mais votre croyance que le toString()tableau d'un octet retournera un résultat utile est incorrecte.
Louis Wasserman

Réponses:


951

L'objet dont votre méthode a decompressGZIP()besoin est a byte[].

La réponse technique de base à la question que vous avez posée est donc:

byte[] b = string.getBytes();
byte[] b = string.getBytes(Charset.forName("UTF-8"));
byte[] b = string.getBytes(StandardCharsets.UTF_8); // Java 7+ only

Cependant, le problème avec lequel vous semblez lutter est que cela ne s'affiche pas très bien. L'appel toString()vous donnera simplement la valeur par défaut Object.toString()qui est le nom de la classe + l'adresse mémoire. Dans votre résultat [B@38ee9f13, le [Bmoyen byte[]et 38ee9f13est l'adresse mémoire, séparés par un @.

À des fins d'affichage, vous pouvez utiliser:

Arrays.toString(bytes);

Mais cela s'affichera simplement sous la forme d'une séquence d'entiers séparés par des virgules, qui peut ou non être ce que vous voulez.

Pour obtenir un Stringretour lisible d'un byte[], utilisez:

String string = new String(byte[] bytes, Charset charset);

La raison pour laquelle la Charsetversion est préférée, c'est que tous les Stringobjets en Java sont stockés en interne en UTF-16. Lors de la conversion en un, byte[]vous obtiendrez une répartition différente des octets pour les glyphes donnés String, en fonction du jeu de caractères choisi.


26
string.getBytes ("UTF-8") nécessite la gestion d'une exception UnsupportedEncodingException, contrairement à string.getBytes (Charset.forName ("UTF-8")). Discutant de la méthode «meilleure», je laisse un exercice au lecteur.
Michael Warner

20
string.getBytes(StandardCharsets.UTF_8)peut également être utilisé, et c'est la même chose questring.getBytes(Charset.forName("UTF-8"))
Bahadır Yağan

3
Je crois que StandardCharsetsc'est nouveau avec Java 7
Stewart

2
Je ne comprends pas pourquoi cette réponse a reçu autant de votes positifs. C'est peut-être vrai, mais ce n'est pas très utile ... juste quelques lignes de code, dont la plupart ont déjà eu l'OP, et sans expliquer ce qui Charset.forName("UTF-8")fait la différence ou pourquoi c'est important.
LarsH

3
@LarsH Vous faites valoir un bon argument. Pour être honnête, je ne m'attendais pas à ce que cette réponse devienne si populaire. J'ai maintenant élargi la réponse afin de "mériter" les votes positifs. J'espère que c'est une amélioration.
Stewart


14

Essayez d'utiliser String.getBytes (). Il renvoie un octet [] représentant des données de chaîne. Exemple:

String data = "sample data";
byte[] byteData = data.getBytes();

14

Simplement:

String abc="abcdefghight";

byte[] b = abc.getBytes();

Que faire si abccontient des caractères non US-ASCII, comme "greater than 2³² − 1"ou simplement des données binaires (comme " A b2")?
U. Windl

cela ne fonctionne pas pour les caractères comme cette chaîne n'a que 5 caractères. Cependant, lorsque j'utilise, getBytes()j'ai 7 caractères.
Teocci

11

Vous pouvez utiliser String.getBytes()ce qui retourne le byte[]tableau.


7

Vous voudrez peut-être essayer return new String(byteout.toByteArray(Charset.forName("UTF-8")))


1
Merci d'avoir montré l'inverse des octets à la chaîne.
Trismegistos

1

Il n'est pas nécessaire de changer java en tant que paramètre String. Vous devez changer le code c pour recevoir une chaîne sans pointeur et dans son code:

Bool DmgrGetVersion (String szVersion);

Char NewszVersion [200];
Strcpy (NewszVersion, szVersion.t_str ());
.t_str () applies to builder c ++ 2010

1

Je sais que je suis un peu en retard à la fête mais cela fonctionne plutôt bien (notre professeur nous l'a donné)

public static byte[] asBytes (String s) {                   
           String tmp;
           byte[] b = new byte[s.length() / 2];
           int i;
           for (i = 0; i < s.length() / 2; i++) {
             tmp = s.substring(i * 2, i * 2 + 2);
             b[i] = (byte)(Integer.parseInt(tmp, 16) & 0xff);
           }
           return b;                                            //return bytes
    }

1
Cela décode le tableau d'octets codés en hexadécimal. Quelque chose de très différent de l'objet de cette question.
Palec
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.