2016-05-24 12 views
0

Ich habe das folgende Problem. Ich verwende Java, um ein Byte-Array aus einer Datei zu erstellen. So mache ich folgendes:Java - Warum gibt readAllBytes falsche Bytecodes zurück?

byte[] myByteArray = Files.readAllBytes(filename); 

Für viele der Bytes gibt es jedoch falsche/negative Werte zurück.

Zum Beispiel, wenn ich mit Javascript testen, um jedes Byte einer Datei z.

(readbytes ist eine Funktion im Programm Im, die das Byte an einer bestimmten Position gibt).

Dies gibt die korrekte Bytes

So Im fragen, warum funktioniert Java Rückkehr falsche Codes? Hat das etwas mit vorzeichenlosen Werten zu tun?

+0

Nein, aber es hat alles mit 'signed' Werten zu tun, da Java keine vorzeichenlosen Werte hat (mit Ausnahme von' char'). – Kayaman

Antwort

1

Java kennt keine Bytes ohne Vorzeichen. Zum Beispiel würde das vorzeichenlose Byte 255 als seine signierte Version -1 gedruckt werden. Im Speicher wäre der tatsächliche Wert jedoch gleich und würde als 255 dargestellt.

Wenn Sie ein Byte in seine vorzeichenlose Darstellung konvertieren möchten, können Sie den bitweisen AND-Operator verwenden.

Zum Beispiel:

bytes[x] & 0xff 

Java nicht weiß, über Bytes zur Laufzeit entweder für jeden Operanden, der auf die Java-Stack virtuellen Maschine geschoben werden kann. Tatsächlich führt jede Operation, die Sie auf einen ganzzahligen Wert anwenden, zu einer Ganzzahl. Das ist der Grund, warum ((byte)-1) & 0xff) zu einer Ganzzahl führt und der Wert 255 ist. Wenn Sie diesen Wert in einem Byte speichern möchten, müssen Sie ihn erneut in byte umwandeln, was natürlich -1 ist.

byte x = -1; // java is friendly enough to insert the implicit cast here 
System.out.println(x); // -1 
System.out.println(x & 0xff); // 255 
byte y = (byte)(x & 0xff); // must add (byte) cast 
System.out.println(y); // -1 

auch im Auge behalten, die technisch die Ausgabe, die Sie anders sehen, ist aber der Inhalt ist immer noch die gleiche, da Sie von Java Byte mit Vorzeichen immer wieder in seine unsigned Darstellung abbilden können. Idealerweise würden Sie etwas wie DataInputStream verwenden, das Ihnen int readUnsignedByte() anbietet.

+0

Hallo Joa, ich frage mich, wie in unsigned Bytes konvertieren? Ich hoffe, dass ich mit dem gleichen Array von Int enden kann, wie ich es im Javascript-Fall bekomme. Gibt es eine Möglichkeit, das Byte-Array irgendwie zu durchlaufen und jeden Wert in das vorzeichenlose Äquivalent zu ändern? –

+0

Sie können immer ein neues Array von Ganzzahlen erstellen und alle Werte manuell kopieren. int [] ubytes = neuer int [bytes.length]; für (int i = 0; i

+0

Das war sehr hilfreich Joa. Vielen Dank. –

Verwandte Themen