Datentypen bits, bytes, chars - Verständnisfrage

grisu

Mitglied
Hallo zusammen!

Ich beschäftige mich nebenbei immer wieder gern mit Java, bin gerade dabei, das I/O System durchzugehen, bin durch Zufall auf diese Frage gekommen.

Folgender Code:
Java:
DataInputStream dis = new DataInputStream (new FileInputStream (new File ("C:/xampp/htdocs/workspace/javaFiles/poem.txt")));

String s = "";
while (dis.available() != 0)
	s += (char) dis.readByte();
			
System.out.println (s);
Jetzt fallen natürlich die Umlaute weg, weil Umlaute größer als ein byte sind (in UTF-8/16). Richtig verstanden?

Java:
String s = "";
while (dis.available() != 0)
{
	byte b = dis.readByte();
	System.out.println (Integer.toBinaryString(b));
	s += (char) b;
}
Jetzt wirds spannend 😉
Hier hab ich für die Umlaute 4 bytes in der Console. Wie kann ein byte auf einmal 4 bytes groß sein? Hängt das mit dem Cast nach int zusammen? Aber wenn ich ein byte lese, und dann nach int caste, wirds zwar größer, aber es kann ja nicht auf einmal einen anderen Wert annehmen?
Und generell, wenn ein char 2 bytes groß ist, und die Umlaute 4 bytes lang sind, wie geht sich das dann aus?
Und noch eine Frage: Mein Textfile ist UTF-8. Laut Wiki ist für ein 1-byte-großes Zeichen das höchste bit 0. Bei mir in der Console allerdings nicht. Warum?

Nächster Code:
Java:
String s = "";
while (dis.available() != 0)
{
	s += (char) dis.read();
}
			
System.out.println (s);
Jetzt gehts auf einmal. "Reads the next byte of data from this input stream. The value byte is returned as an int in the range 0 to 255". Aber wenn die Umlaute 4 bytes groß sind, er es als ein byte einliest und dann als int zurückgibt...??


Ich blick nicht mehr durch. Hilfe! 🙂
Danke!

Liebe Grüße
grisu
 
gehts bei allem einen Tick genauer?
welche Eingaben, welche Ausgaben??

wenn du Ausgaben wie
1100101
hast, dann sind das ja nur 7 bit, das höchste ist nicht ausgegeben, ist die 0, wie im Wiki angegeben

mit '4 Byte groß' meinst du vielleicht Ausgaben a la
11111111111111111111111111000011
das ist ein negatives Byte, als int sieht das eben so aus,
an den vielen 1en erkennt man doch, dass da zu 75% keine sinnvolle Information drinsteht,
nur die letzten 8 Bits haben Inhalt, eben genau ein Byte

edit:
die postiven Bytes, also z.B. 1100101, müßten eigentlich auch als
00000000000000000000000001100101
dargestellt werden, das Kürzen der Nullen ist ganz schön nervig

-------

> Jetzt fallen natürlich die Umlaute weg, weil Umlaute größer als ein byte sind (in UTF-8/16). Richtig verstanden?

ich denke ja
 
Zuletzt bearbeitet von einem Moderator:
gehts bei allem einen Tick genauer?
welche Eingaben, welche Ausgaben??

wenn du Ausgaben wie
1100101
hast, dann sind das ja nur 7 bit, das höchste ist nicht ausgegeben, ist die 0, wie im Wiki angegeben

mit '4 Byte groß' meinst du vielleicht Ausgaben a la
11111111111111111111111111000011
das ist ein negatives Byte, als int sieht das eben so aus,
an den vielen 1en erkennt man doch, dass da zu 75% keine sinnvolle Information drinsteht,
nur die letzten 8 Bits haben Inhalt, eben genau ein Byte

Hm das mit den 7 bit stimmt, das hab ich irgendwie übersehen. Dumme Frage: Woran erkennt man ein negatives byte in Java? An der 1 im höchsten bit?


Nochmal ein Beispiel:
Java:
DataInputStream dis = new DataInputStream (new FileInputStream (new File ("C:/xampp/htdocs/workspace/javaFiles/poem.txt")));
			
String s = "";
while (dis.available() > 0)
{
	int b = dis.read ();
        System.out.println (Integer.toBinaryString(b) + " - " + b);
	s += (char) b;
}
			
System.out.println (s);

//Ausgabe:
11111100 - 252    //üüüäüäüäüäü
11111100 - 252
11111100 - 252
11100100 - 228
11111100 - 252
11100100 - 228
11111100 - 252
11100100 - 228
11111100 - 252
11100100 - 228
11111100 - 252
etc.

Ich glaub ich komm der Sache näher. Mal ganz langsam von vorne:
Ein Umlaut-u hat den Wert 252. Wenn ich 252 nach byte caste, ergibt das -4, das ist genau das negative byte, das du oben angesprochen hast. Das ergibt natürlich keinen char, weil chars nur positive Werte haben.
Der Unterschied im letzten Beispiel ist also der, das er wirklich den byte-Wert ausliest und als int zurückgibt. Als int deshalb, weil ein byte eben von 0-255 geht, und nicht von -128 bis 127, wie ein "byte" in Java. Richtig?
 
Dumme Frage: Woran erkennt man ein negatives byte in Java? An der 1 im höchsten bit?
Ja, aber der Rest ist nicht einfach die zugehörige positive Zahl, das höchste Bit funktioniert nicht einfach als Vorzeichen.

Einzelheiten: Zweierkomplement ? Wikipedia

Und das ist wirklich keine dumme Frage. Ich würde mir wünschen, dass das jeder Programmierer das wüsste, aber ich habe schon viele "alte Hasen" erlebt, die mit Bit-Operationen und char-Konvertierungen so ihre Schwierigkeiten hatten.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben