155 votes

Transformer un ByteBuffer en String

Est-ce une approche correcte pour convertir un ByteBuffer en String de cette manière ?

String k = "abcd";
ByteBuffer b = ByteBuffer.wrap(k.getBytes());
String v = new String(b.array());

if(k.equals(v))
    System.out.println("it worked");
else
    System.out.println("did not work");

La raison de ma question est que cela semble trop simple, alors que d'autres approches telles que Java : Conversion de String en ByteBuffer et problèmes associés semble plus complexe.

3 votes

Eh bien, tu as essayé ?

6 votes

Oui, je l'ai fait et ça marche. Mais j'ai vu d'autres implémentations plus complexes, telles que stackoverflow.com/questions/1252468/

1 votes

@Doorknob et. al. Il manque l'encodage et son exemple (lorsque la syntaxe sera corrigée) fonctionnera, mais sa méthode n'est toujours pas correcte.

2voto

宏杰李 Points 8709

La Racine de cette question est comment décoder les octets en chaîne de caractères ?

cela peut être fait avec le JAVA NIO CharSet :

public final CharBuffer decode(ByteBuffer bb)

FileChannel channel = FileChannel.open(
  Paths.get("files/text-latin1.txt", StandardOpenOption.READ);
ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer);

CharSet latin1 = StandardCharsets.ISO_8859_1;
CharBuffer latin1Buffer = latin1.decode(buffer);

String result = new String(latin1Buffer.array());
  • D'abord nous créons un canal et le lisons dans un tampon
  • Ensuite, la méthode de décodage décode un tampon Latin1 en un tampon char.
  • Nous pouvons ensuite placer le résultat, par exemple, dans une chaîne de caractères (String).

0 votes

Votre code ne décode pas de latin1 à utf8. Bien que votre code soit correct, appeler le CharBuffer utf8Buffer est quelque peu trompeur car il n'a pas d'encodage.

1voto

Eric Leschinski Points 14289

Convertissez une chaîne en ByteBuffer, puis de ByteBuffer en chaîne en utilisant Java :

import java.nio.charset.Charset;
import java.nio.*;

String babel = "obufscate thdé alphebat and yolo!!";
System.out.println(babel);
//Convert string to ByteBuffer:
ByteBuffer babb = Charset.forName("UTF-8").encode(babel);
try{
    //Convert ByteBuffer to String
    System.out.println(new String(babb.array(), "UTF-8"));
}
catch(Exception e){
    e.printStackTrace();
}

qui imprime d'abord la chaîne de caractères nue, puis le ByteBuffer casté en array() :

obufscate thdé alphebat and yolo!!
obufscate thdé alphebat and yolo!!

Cela m'a également été utile, la réduction de la chaîne en octets primitifs peut aider à inspecter ce qui se passe :

String text = "こんにちは";
//convert utf8 text to a byte array
byte[] array = text.getBytes("UTF-8");
//convert the byte array back to a string as UTF-8
String s = new String(array, Charset.forName("UTF-8"));
System.out.println(s);
//forcing strings encoded as UTF-8 as an incorrect encoding like
//say ISO-8859-1 causes strange and undefined behavior
String sISO = new String(array, Charset.forName("ISO-8859-1"));
System.out.println(sISO);

Imprime votre chaîne interprétée en UTF-8, puis à nouveau en ISO-8859-1 :

こんにちは
ããã«ã¡ã¯

0voto

Jas Points 177

Remarquez (en dehors de la question de l'encodage) que certains des codes les plus compliqués liés se donnent la peine d'obtenir la partie "active" du ByteBuffer en question (par exemple en utilisant position et limite), plutôt que de simplement encoder tous les octets dans le tableau de support entier (comme le font de nombreux exemples dans ces réponses).

0voto

private String convertFrom(String lines, String from, String to) {
    ByteBuffer bb = ByteBuffer.wrap(lines.getBytes());
    CharBuffer cb = Charset.forName(to).decode(bb);
    return new String(Charset.forName(from).encode(cb).array());
};
public Doit(){
    String concatenatedLines = convertFrom(concatenatedLines, "CP1252", "UTF-8");
};

0voto

Jitendra Asawa Points 23

Voici une fonction simple pour convertir un tampon d'octets en chaîne de caractères :

public String byteBufferToString(ByteBuffer bufferData) {
    byte[] buffer = new byte[bufferData.readableByteCount()];
    // read bufferData and insert into buffer 
    data.read(buffer);
    // CharsetUtil supports UTF_16, ASCII, and many more
    String text = new String(buffer, CharsetUtil.UTF_8);
    System.out.println("Text: "+text);
    return text;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X