2009-03-30 4 views
22

Ich muss ein Zeichen in ein Byte oder ein Byte-Array konvertieren. In anderen Sprachen weiß ich, dass ein Zeichen nur ein einzelnes Byte ist. Betrachtet man jedoch die Java-Zeichenklasse, ist ihr Min-Wert \ u0000 und ihr Maximalwert ist \ uFFFF. Dies lässt den Eindruck entstehen, dass ein Zeichen 2 Byte lang ist.Darstellen von Zeichen als ein Byte in Java

Kann ich es als ein Byte speichern oder muss ich es als zwei Bytes speichern?

Bevor jemand fragt, werde ich sagen, dass ich versuche, dies zu tun, weil ich unter einer Schnittstelle arbeite, die erwartet, dass meine Ergebnisse ein Byte-Array sind. Also muss ich meinen Char in einen konvertieren.

Bitte lassen Sie mich wissen und helfen Sie mir, dies zu verstehen.

Danke, JBU

Antwort

34

Zeichen Bytes zu konvertieren, müssen Sie eine character encoding angeben. Einige Zeichenkodierungen verwenden ein Byte pro Zeichen, während andere zwei oder mehr Bytes verwenden. Tatsächlich gibt es für viele Sprachen viel zu viele Zeichen, um mit einem einzigen Byte zu codieren.

In Java ist die getBytes(String encoding) Methode getBytes(String encoding) die einfachste Möglichkeit zum Konvertieren von Zeichen in Byte mit der String-Klasse. Diese Methode ersetzt jedoch lautlos Zeichen durch & # xfffd; wenn das Zeichen nicht unter der angegebenen Codierung zugeordnet werden kann. Wenn Sie mehr Kontrolle benötigen, können Sie einen CharsetEncoder konfigurieren, um diesen Fall mit einem Fehler zu behandeln oder ein anderes Ersatzzeichen zu verwenden.

+1

würde UTF-8 und Speichern meiner Zeichen als ein einzelnes Byte in Ordnung sein? Ich denke ja, auch wenn das letzte Bit ein Vorzeichen für ein Byte war. – jbu

+0

Sie sollten die Zeichencodierung verwenden, die für die Schnittstelle erforderlich ist, unter der Sie arbeiten. – erickson

+1

Für single-Byte-Codierungen verwenden Sie die ISO-8859-Familie –

0

Char in Java ist ein vorzeichenloser 16-Bit-Wert. Wenn das, was Sie haben, in 7 Bits passt, dann tun Sie einfach die Umwandlung in ein Byte (zum Beispiel passt ASCII).

Sie könnten auch die java.nio.charset APIs auschecken.

+0

Es muss in 7 Bits passen, um sicher zu arbeiten. – erickson

+0

Ja, ich wollte nicht in Extended ASCII ... aber ich werde meine Antwort aktualisieren. – TofuBeer

4

zu erweitern, was andere sagen, wenn Sie ein Zeichen, dass Sie als Byte-Array benötigen, dann zuerst Sie einen String erstellen, das Zeichen enthält, und dann aus dem String die Byte-Array erhalten:

private byte[] charToBytes(final char x) { 
    String temp = new String(new char[] {x}); 
    try { 
    return temp.getBytes("ISO-8859-1"); 
    } catch (UnsupportedEncodingException e) { 
    // Log a complaint 
    return null; 
    } 
} 

Verwenden Sie natürlich den entsprechenden Zeichensatz. Viel effizienter, dass dies mit Strings zu arbeiten beginnen würde, anstatt ein Zeichen nach dem anderen zu nehmen, wandle es in einen String um und konvertiere dann in ein Byte-Array.

8

Ein Zeichen ist tatsächlich 16 Bits in Java (und ist auch der einzige vorzeichenlose Typ !!).

Wenn Sie sicher sind, dass die Codierung Ihrer Zeichen ASCII ist, können Sie sie einfach auf ein Byte umwandeln (da ASCII nur die unteren 7 Bits des Zeichens verwendet).

Wenn Sie die Zeichen nicht ändern müssen, oder verstehen, ihre Bedeutung in einem String, können Sie einfach speichern Zeichen auf zwei Bytes, wie:

char[] c = ...; 
byte[] b = new byte[c.length*2]; 
for(int i=0; i<c.length; i++) { 
    b[2*i] = (byte) (c[i]&0xFF00)>>8; 
    b[2*i+1] = (byte) (c[i]&0x00FF); 
} 

(Es kann ratsam sein, die 2 * ersetzen durch eine Rechtsverschiebung, wenn Geschwindigkeit zählt).

Beachten Sie jedoch, dass einige tatsächliche (angezeigte) Zeichen (oder genauer gesagt Unicode-Codepunkte) auf zwei aufeinanderfolgende Zeichen geschrieben werden. Das Schneiden zwischen zwei Zeichen stellt nicht sicher, dass Sie zwischen den tatsächlichen Zeichen schneiden.

Wenn Sie Ihr char-Array dekodieren/codieren oder anderweitig auf String-Art manipulieren müssen, sollten Sie lieber versuchen, Ihr char-Array oder String mit dem Java zu dekodieren und zu codieren.io Tools, die eine korrekte Zeichenmanipulation sicherstellen.

+0

Geben Sie anstelle des hier angezeigten Codes "UTF-16" als Zeichencodierung an und verwenden Sie integrierte Codierungs-APIs. Weniger Code für Sie zum Implementieren, Testen und Pflegen und Erfassen von Absicht für Leser des Codes. – erickson

+0

Und auch zwei Größenordnungen weniger Geschwindigkeit, wegen der Kodierung/Dekodierung, die in diesem Fall nicht benötigt wird. – Varkhan

+0

Es ist nur Codierung, und wenn es langsamer ist (was ich bezweifle), ist es nicht ein Faktor von 100. Warum denkst du, dass die UTF-16-Codierung etwas anderes als deinen Code macht? – erickson

Verwandte Themen