2016-07-25 78 views
3

我有無符號短褲的二進制文件。我需要將這個字節的無符號值轉換爲JAVA中的原始短語。字節順序是Little Endian。我想以這樣的方式從二進制文件轉換2個字節(無符號短)到Java短

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)); 
     } 
    } 

例子: 情況1(OK): 無符號短:8237 十六進制(小端):2D 20 二進制(大端):0010 0000 0010 1101 和System.out.println(Integer.toBinaryString(s))給我們 10000000101101.這是正確的。

殼體2(不正常) 無符號短:384 以十六進制(小端):80 01 二進制(大端):0000 0001 1000 0000 和的System.out.println(Integer.toBinaryString(S ))給我們 11111111111111111111111110000000. System.out.println(s)給我們-128。這是不正確的。 我如何從中獲得384的價值?

有人知道爲什麼它不起作用嗎?

+0

這是正確的。簽名擴展。字節是用Java簽名的。 – EJP

+0

好吧,但我怎麼能得到這個384? – santiag

+0

[[DataInputStream#readUnsignedShort'](https://docs.oracle.com/javase/8/docs/api/java/io/DataInputStream.html#readUnsignedShort--)是否適合您? – bradimus

回答

0

Java在進行整數計算之前將所有內容都轉換爲int,並且在字節被簽名後,您將得到一個符號擴展名。您必須強制字節保持[0; 255]範圍按位和 -它們與0xFF:

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

謝謝,它的工作。 – santiag