2016-07-25 25 views
3

Ich habe eine Binärdatei mit unsignierten Kurzschlüssen. Ich muss einen vorzeichenlosen Wert von diesen Bytes zu einem primitiven Kurzschluss in JAVA nehmen. Byte-Reihenfolge ist Little Endian. Ich versuche, auf diese Weise:Konvertiere 2 Byte (unsigned short) nach Java kurz aus der Binärdatei

byte[] bytes = new byte[frameLength]; 
    for(int i = 0; i < fh.nFrames; i++) { 
     raf.readFully(bytes); 
     for(int j = 2; j < frameLength/2; j++) { 
      short s; 
      s = (short) (bytes[2*j + 1] << 8 | bytes[2 * j]);  
      System.out.println(s); 
      System.out.println(Integer.toBinaryString(s)); 
     } 
    } 

Beispiel: Fall 1 (ok): unsigned short: 8237 in hex (Little Endian): 2D 20 binär (Big Endian): 0010 0000 0010 1101 und System.out.println (Integer.toBinaryString (s)) geben Sie 10000000101101. Es ist korrekt.

Fall 2 (nicht ok) unsigned short: 384 in hex (Little Endian): 80 01 binär (Big Endian): 0000 0001 1000 0000 und System.out.println (Integer.toBinaryString (s)) geben Sie uns 11111111111111111111111110000000. System.out.println (s) geben Sie -128. Das ist nicht richtig. Wie kann ich 384 Wert von diesem bekommen?

Jemand hat eine Idee, warum es nicht funktioniert?

+0

Es ist richtig. Erweiterung signieren. Bytes sind in Java signiert. – EJP

+0

Ok, aber wie kann ich 384 davon bekommen? – santiag

+0

Wird ['DataInputStream # readUnsignedShort'] (https://docs.oracle.com/javase/8/docs/api/java/io/DataInputStream.html#readUnsignedShort--) für Sie arbeiten? – bradimus

Antwort

0

Java konvertiert alles in int, bevor Ganzzahlberechnungen durchgeführt werden, und da Bytes signiert sind, erhalten Sie eine Vorzeichenerweiterung. Sie müssen Bytes zwingen, in [0; 255] Bereich von bitweise und-ing sie mit 0xFF:

s = (short) ((bytes[2*j + 1] & 0xFF) << 8 | (bytes[2 * j] & 0xFF)); 
+0

Danke, es funktioniert. – santiag