将二进制文件中的 2 字节(unsigned short)转换为 Java short

Convert 2 byte (unsigned short) to Java short from binary file

我有带有未签名短裤的二进制文件。我需要从这个字节中获取无符号值到 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(好的): 无符号短: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 在进行整数计算之前将所有内容转换为 int,并且随着字节被签名,您将获得符号扩展。您必须强制字节保留在 [0; 255] 范围按位 and-ing 它们与 0xFF:

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