2016-10-17 3 views
-1

las ich von einem TCP/IP-Socket-s:Java Byte zu Char Umwandlung

byte[] bbuf = new byte[30]; 
s.getInputStream().read(bbuf); 
for (int i = 0; i < bbuf.length; i++) 
{ 
    System.out.println(Integer.toHexString((int) (bbuf[i] & 0xff))); 
} 

Diese CA 68 9F 75 Ausgänge, die, was ich erwarten würde. Jetzt möchte ich Zeichen verwenden, anstatt

char[] cbuf = new char[30]; 
BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
for (int i = 0; i < cbuf.length; i++) 
{ 
    System.out.println(Integer.toHexString((int) (cbuf[i]))); 
} 

die Ausgabe jetzt ist CA 68 178 75. So das dritte Byte (und nur das dritte Byte) macht den Unterschied. Ich nehme an, dass es mit den Zeichensätzen zu tun hat und dass ich im InputStreamer einen Zeichensatz angeben muss. Ich habe keine Ahnung, wie ich herausfinden soll, welchen Zeichensatz ich verwenden muss. Zweitens bin ich überrascht, wenn es aufgrund von Zeichensätzen ist, dass ich nur das Chaos mit genau einem Charakter bekomme. Ich habe alle möglichen anderen Charaktere ausprobiert, aber das scheint die einzige zu sein, die ich finden konnte.

Wer kann das Geheimnis lösen?

+0

Sie müssen weiß, wie die Charaktere codiert wurden. Ich würde 'UTF-8' anstelle der Standardcodierung verwenden, um damit zu beginnen. –

Antwort

0

InputStreamReader wird die Bytes aus dem Eingabestream in Zeichen mit einem character encoding konvertieren. Da Sie nicht explizit angegeben haben, welche Zeichencodierung verwendet werden soll, wird die Standardzeichencodierung Ihres Systems verwendet.

Wie die Bytes konvertiert werden, hängt davon ab, welche Zeichencodierung verwendet wird.

Wenn es sich bei den Daten um Binärdaten handelt, die keinen Text darstellen, der mit einer Zeichenkodierung codiert wurde, dann ist die Verwendung von InputStreamReader der falsche Weg, um diese Daten zu lesen.

Siehe auch: Streams and readers/writers

1

Ihr Problem ist, dass man Birnen mit Äpfeln vergleichen; Bytes sind nicht identisch mit Zeichen. In Ihrem Code, den Charakter Ÿ auf folgende Weise dargestellt:

  • 9F (Byte codiert mit dem Windows-1252)
  • 178 (char codierter UTF-16, die das ist Codierung Java verwendet immer für Zeichen intern)

Als Beweis, was ich sage, check this:

String myString = "Caña"; 
byte[] bbuf = myString.getBytes();  // [ 43, 61, C3, B1, 61 ] (UTF-8 on my machine) 
char[] cbuf = myString.toCharArray(); // [ 43, 61, F1, 61 ] (Java uses UTF-16 internally) 

nun eine Analyse des Problems:

  • Sie aus einem String einen Byte-Array nahmen, ich denke, dies zu tun: myString.getBytes() wie Sie nicht eine Codierung, wird das System der Standard Verwendung in Ihrem angab Maschine (Windows-1252)

  • Wenn Sie Ihre Bytes in eine Zeichenfolge mit InputSteanReader usw. lesen, gibt es eigentlich kein Problem, weil Sie von einem anderen (oder der gleichen) Windows-Maschine lesen, das Problem ist, wenn Sie bekommen Das Array von Zeichen (anstelle eines Arrays von Bytes) erwartet das gleiche Ergebnis (verwenden Sie myString.getBytes() anstelle von myString.toCharArray() und Sie werden Ihre Bytes richtig sehen).

Schließlich einige Ratschläge:

  • immer explictly die Codierung deklarieren, wenn Sie zwischen Strings und Byte-Arrays konvertieren:

    byte[] bbuf = myString.getBytes(Charset.forName("UTF-8")); 
    
    String myString = new String(bbuf, Charset.forName("UTF-8")); 
    
  • Nie Zeichen und Bytes mischen, sind sie nicht das gleiche