我有带有未签名短裤的二进制文件。在JAVA中,我需要从这个字节取无符号值到原语缩写。字节顺序是小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(确定):未签名短: 8237在十六进制(小endian):2D 20在二进制(大端):001000101101和System.out.println(Integer.toBinaryString(s))给我们10000000101101。这是正确的。
例2(不确定)未签名短: 384在十六进制(小endian):8001在二进制(大端):0000 0001 1000 0000和System.out.println(S)给我们11111111111111111111111110000000。System.out.println给我们128号。这不对。我怎么能从中得到384的价值?
有人知道为什么不起作用吗?
发布于 2016-07-25 12:16:11
Java在进行整数计算之前将所有内容转换为int,并且当字节被签名时,您将得到一个符号扩展。您必须强制字节保持在0;255范围内,按位排列并使用0xFF:
s = (short) ((bytes[2*j + 1] & 0xFF) << 8 | (bytes[2 * j] & 0xFF)); https://stackoverflow.com/questions/38567135
复制相似问题