Während ich ein Java-Buch über Byteströme las, stieß ich auf dieses Beispiel, das das Buch verwendet, um den Unterschied zwischen den beiden zu zeigen. Das verwendete Beispiel ist die Zahl 199. Wenn diese Zahl in den Zeichenstrom geschrieben wird, wird sie gemäß dem Buch als drei verschiedene Zeichen geschrieben: 0x31 0xC7 0x39. Wenn dies jedoch in den Byte-Stream geschrieben wird, wird es als einzelner Wert 0xC7 geschrieben. Mein Zweifel ist, 199 passt nicht in ein Byte in Java. Also, sollte es nicht als zwei Bytes anstelle von einem geschrieben werden? Wird 199 in Byteströmen als 1 Byte oder 2 Byte geschrieben?Verwirrung über Byteströme
Antwort
Wenn Sie OutputStream.write(int)
aufrufen, was eine Methode zum Schreiben eines einzelnen Bytes ist, ignoriert es alle Bits mit Ausnahme der unteren acht. Das bedeutet, dass 199
und -57
genauso geschrieben werden. Für diese spezielle Methode funktioniert das so, weil es nur ein Byte schreiben soll.
Wenn Sie eine andere Methode aufgerufen haben, wird es anders funktionieren. Zum Beispiel schreibt DataOutputStream.writeInt
eine Ganzzahl als vier Bytes, weil das für diese Methode ist.
Ich habe gerade diesen Code versucht: 'int n = 199; OutputStream f3 = neuer FileOutputStream ("file4.txt"); f3.write (n); 'und ja, es schreibt 0xC7 was wie gesagt -57 ist. Also, ist es möglich, 199 selbst mit Byte-Stream (nicht DataOutputStream) zu schreiben? Ich meine, ohne korrumpiert zu werden. – birraa
Sie könnten zwei Bytes schreiben, wenn Sie das wollen. Wie Sie sie zurücklesen, bestimmt, ob Sie sie als zwei Zahlen von je einem Byte oder als eine Anzahl von zwei Bytes (eine "kurze") betrachten. – khelwood
- 1. Verwirrung über $ und Operation
- 2. Verwirrung über CoffeeScript Variablenbereich
- 3. Verwirrung über OleDbCommand
- 4. Verwirrung über konstante Ausdrücke
- 5. Verwirrung über Ajax
- 6. Verwirrung über Rubin Klassenvariable
- 7. Verwirrung über Gleichheit
- 8. Verwirrung über BCNF
- 9. Verwirrung über verschachtelten Koaleszenzoperator
- 10. Verwirrung über Gitter- und Blockmaße
- 11. Verwirrung über Datentransportbefehle in Github
- 12. Standard-ML: Verwirrung über Referenzzellen
- 13. Verwirrung über flatMapLatest in RxSwift
- 14. Verwirrung über PHP 7 refcount
- 15. Verwirrung über Zeichenzeiger in C
- 16. Verwirrung über findOne() und remove()
- 17. Verwirrung über Texture2D und ShaderResourceViews
- 18. Verwirrung über Stapelwachstum und Adressierung
- 19. @NgModules Verwirrung über dynamische bootstrapping
- 20. Verwirrung über Haskell "Nichts" Wert
- 21. Verwirrung über statischen CRTP-Polymorphismus
- 22. Verwirrung über Auto-Run-Funktionen
- 23. Verwirrung über anonyme Methoden Parameter
- 24. C++: Verwirrung über Weiterleitung Referenz
- 25. Verwirrung über Haskell-Typ-Inferenz
- 26. Verwirrung über Remote und Zweig
- 27. SVG: Verwirrung über relative Pfadkoordinaten
- 28. Verwirrung über eine Python-Rekursionsfunktion
- 29. Verwirrung über Mustervergleich in Java
- 30. Verwirrung über AWS EBS Snapshot
Für diese Zwecke ist ein Byte unsigned, also ist es in dem Bereich '0-255' – khelwood
Byte ist in Java signiert, nicht wahr? Wie kann es unsigniert sein? – birraa
Ein _byte_ ist nur 8 Datenbits: Sie können es als eine Zahl zwischen 0 und 255 betrachten, auch wenn der Java-Byte-Typ es anders betrachten würde. – khelwood