2014-10-09 7 views
16

So stieß ich auf etwas, das mich verwirrt, wenn ein byte zu char Gießen, in der Regel würde ich dies tun:Java-Syntax - zusätzliches Pluszeichen nach der Umwandlung ist gültig?

for (byte b:"ABCDE".getBytes()) { 
    System.out.println((char)b); 
} 

Welche

A 
B 
C 
D 
E 

ich aus Versehen eine + zwischen dem (char) auszudrucken wird und b und bekam die gleiche Ergebnis !?

Wie so:

for (byte b:"ABCDE".getBytes()) { 
    System.out.println((char) + b); 
} 

Warum genau ist das passiert?

Mache ich im Wesentlichen (char)(0x00 + b)? Weil

System.out.println((char) - b); 

ergibt ein anderes Ergebnis.

Hinweis: Die Verwendung von Java-Version 1.8.0_20

+12

Indem Sie Bytes direkt in Zeichen umwandeln, ignorieren Sie [Zeichenkodierung] (http://en.wikipedia.org/wiki/Character_encoding). – Jesper

Antwort

26

Warum genau passiert das?

Wenn Sie einen unären - Operator vor eine Zahl oder einen Ausdruck setzen, wird er negiert.

In ähnlicher Weise, wenn Sie einen unären Operator + vor einer Zahl oder Ausdruck setzen, tut es nichts.

Ein sicherer Weg, um ein Byte zu einem Zeichen zu konvertieren ist

char ch = (char)(b & 0xFF); 

Diese für Zeichen zwischen 0 und 255 arbeiten, anstatt 0 bis 127.

BTW können Sie einstellige Operatoren schreiben einige verwirrende Code wie

int i = (int) + (long) - (char) + (byte) 1; // i = -1; 
+8

wow das letzte ist schrecklich :) – Baldrickk

+1

Wenn die Absicht ist, eine binär codierte Textzeichenfolge in Zeichen zu konvertieren, gibt es eigentlich keinen sicheren Weg, nur um die Bytes zu chars zu werfen. Sie müssen eine der verschiedenen Methoden in der API verwenden, die die Zeichencodierung berücksichtigen (String-Konstruktoren, Reader, CharsetDecoder usw.). – jarnbjo

+0

@jarnbjo +1 Sofern Sie keine US-ASCII- oder ISO-8859-1-Kodierung annehmen können (wie im obigen Beispiel), müssen Sie einen Kodierer verwenden. Sie können einen UTF-8-Encoder selbst schreiben, wenn Sie wirklich daran interessiert sind, aber einer der eingebauten Encoder ist wahrscheinlich die beste Wahl. –

7

b ist ein Byte, und dass b sowie + ausgedrückt werden. Zum Beispiel kann 3 auch als +3 geschrieben werden. Also, ((char) + b) ist dasselbe wie ((char)) b)

5

die + ist der einstellige Plus-Operator - wie kann man sagen, dass 1-entspricht 10, b entspricht . Der Abstand zwischen + und b ist unerheblich. Dieser Operator hat eine höhere Priorität als die Besetzung, also wird nach dem Anwenden (nichts tun, wie angegeben) das resultierende byte dann in eine char umgewandelt und erzeugt das gleiche Ergebnis wie zuvor.

Verwandte Themen