我的二进制文件带有unsigned short。我需要在JAVA中将此字节中的无符号值转换为原始short。字节顺序是Little Endian。我试着这样:
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(确定): unsigned short: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 :(得分:0)
Java在执行整数计算之前将所有内容转换为int,并且当字节被签名时,您将获得符号扩展。你必须强制字节留在[0; 255]按位和它们的范围是0xFF:
s = (short) ((bytes[2*j + 1] & 0xFF) << 8 | (bytes[2 * j] & 0xFF));