将二进制文件中的2字节(无符号短整数)转换为Java short

时间:2016-07-25 11:57:01

标签: java binaryfiles unsigned

我的二进制文件带有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的价值?

有人知道它为什么不工作?

1 个答案:

答案 0 :(得分:0)

Java在执行整数计算之前将所有内容转换为int,并且当字节被签名时,您将获得符号扩展。你必须强制字节留在[0; 255]按位它们的范围是0xFF:

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