2016-05-19 5 views
1

Ich weiß nicht, ob das ein Fehler ist oder es etwas fehlt hier.Ich versuche, die genauen Bytes einer Datei zu bekommen, damit ich an einigen arbeiten kann.Java FileInputStream legt 3-4 Byte im selben Index des Bytearrays?

So habe ich eine byte [1024] Array mit den ersten 1024 Bytes davon zu bekommen, ein char [1024] Array, und ich auf jedes Byte ein Integer.toBinaryString tue, um zu sehen, es ist Wert

Aber in einige Positionen, anstelle einer 8-Bit-Byte, gibt es Werte wie Index [20] = 11111111111111111111111111111111 Index [21] = 11111111111111111111111111111110

Wie kann ein Byte 32 Bit sein?

In diesem Fall ist es sollte einen UTF-16-BOM sein, und nach meinem Test soll es 255 254 sein sollte, so dass nur die letzten 8 von jedem Index für die Hilfe im Voraus Danke

da seine

Antwort

2

Beide Bytes und Ints sind in Java signiert.

Die negativen Werte werden als Zweierkomplemente gespeichert.

Also ein -1 Byte wird als '1111 1111' dargestellt. Dies wird in -1 int umgewandelt, was als '1111 1111 1111 1111 1111 1111 1111 1111' dargestellt wird, was Sie sehen.

Wenn Sie ein Byte b haben und die genaue Bit-für-Bit-Darstellung sehen möchten, müssen Sie ((int) b) & 0xFF tun.

Dies konvertiert Ihr Byte in einen int und setzt alle Bits "über" dem ersten Byte dieses neuen int auf Null zurück.

+0

danke für die Erklärung, mein Programm arbeitet jetzt – dac1n

1

Sie rufen Integer.toBinaryString(), die einen int Parameter dauert.

Die von Ihnen übergebene byte wird automatisch in int umgewandelt. Ein int hat 4 Bytes, daher erhalten Sie die 32 Bits, die Sie sehen.

+0

Der Rest der Bytes sind ok gedruckt. Aber auf jeden Fall gibt es eine andere Methode, wo ich einfach das Byte als String kopieren kann? Ich möchte das tatsächliche Byte in einer Datei wie "00000101 auf Position i" drucken, es in nichts anderes decodieren – dac1n

+1

[Diese Antwort] (http://stackoverflow.com/a/12310078/3558960) stellt eine Lösung dar. –

+0

& 0xFF scheint zu funktionieren. Aber nur um sicher zu sein, wenn ich nur eine println (Byte [i]), und die Konsole zeigt eine ganze Zahl, nimmt es immer noch eine vorzeichenbehaftete Ganzzahl wie mein Fehler oben ist? Ich möchte nur sicherstellen, dass Byte & 0xFF ist genau der Inhalt der Datei – dac1n