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

4

我有一个带有无符号短整型的二进制文件。我需要将这些字节中的无符号值转换为JAVA中的原始短整型。字节顺序是小端模式。我尝试了以下方法:

    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 十六进制(小端): 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的值?
有人知道为什么它不能正常工作吗?

没错。符号扩展。在Java中,字节是有符号的。 - user207421
好的,但是我如何从这里得到384? - santiag
DataInputStream#readUnsignedShort 对你有用吗? - bradimus
1个回答

1
Java在进行整数计算之前会将所有内容转换为int类型,由于字节是有符号的,因此会发生符号扩展。您必须通过按位与0xFF来强制使字节保持在[0;255]范围内。
s = (short) ((bytes[2*j + 1] & 0xFF) << 8 | (bytes[2 * j] & 0xFF)); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接