バイナリファイルに符号なし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の価値を得ることができますか?
誰かがそれがうまくいかない理由を知っていますか?
それは正しいです。署名拡張子。バイトはJavaで署名されています。 – EJP
これで384をどうやって得ることができますか? – santiag
['DataInputStream#readUnsignedShort'](https://docs.oracle.com/javase/8/docs/api/java/io/DataInputStream.html#readUnsignedShort--)が役に立ちますか? – bradimus