2016-07-25 7 views
3

バイナリファイルに符号なしshortがあります。私はこのバイトの符号なしの値をJAVAのプリミティブなshortにする必要があります。バイトオーダーはリトルエンディアンです。私は、このようにしよう:バイナリファイルから2バイト(unsigned short)をJava shortに変換します。

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): 符号なしshort:8237 進中(リトルエンディアン):バイナリ(ビッグエンディアン)での2D 20 :0010 0000 0010 1101 とSystem.out.println(Integer.toBinaryString(s))は 10000000101101を返します。正しいです。

ケース2(OKではない) 符号なしshort:六角(リトルエンディアン)で384 :バイナリ(ビッグエンディアン)で80 01 :0000 0001 1000年0000 とのSystem.out.println(Integer.toBinaryString(S ))私たちを与える 11111111111111111111111110000000. System.out.println私たちを与える-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でそれらををして-INGの:

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

ありがとうございました。 – santiag

関連する問題