3个字节到整数示例都不起作用

时间:2016-11-15 19:44:54

标签: java

背景

我正在使用8,16,24或32位音频数据并将它们转换为整数,但BigInteger无法回收利用它会浪费大量内存,所以我创建了这个类来修复内存消耗。而且看起来ByteBuffer可以很好地完成这项工作,除非输入是3个字节长。

我从未做过任何位或字节操作,所以我完全迷失在这里。

问题

我在 3字节到int 的stackoverflow上找到的所有示例都没有给出想要的结果。检查bytesToInt3方法。

问题

有什么明显的东西我做错了吗?

是否返回新的BigInteger(byte []数据).intValue(); 真的是唯一的解决方案吗?

代码

import java.math.BigInteger;
import java.nio.ByteBuffer;

class BytesToInt {

    // HELP
    private static int bytes3ToInt(byte[] data) {

        // none below seem to work, even if I swap first and last bytes
        // these examples are taken from stackoverflow

        //return (data[2] & 0xFF) | ((data[1] & 0xFF) << 8) | ((data[0] & 0x0F) << 16);
        //return ((data[2] & 0xF) << 16) | ((data[1] & 0xFF) << 8) | (data[0] & 0xFF);
        //return ((data[2] << 28) >>> 12) | (data[1] << 8) | data[0];
        //return (data[0] & 255) << 16 | (data[1] & 255) << 8 | (data[2] & 255);
        return (data[2] & 255) << 16 | (data[1] & 255) << 8 | (data[0] & 255);

        // Only thing that works, but wastes memory
        //return new BigInteger(data).intValue();
    }



    public static void main(String[] args) {

        // Test with -666 example number
        byte[] negativeByteArray3 = new byte[] {(byte)0xff, (byte)0xfd, (byte)0x66};
        testWithData(negativeByteArray3);

    }

    private static void testWithData(byte[] data) {

        // Compare our converter to BigInteger
        // Which we know gives wanted result
        System.out.println("Converter  = " + bytes3ToInt(data));
        System.out.println("BigInteger = " + new BigInteger(data).intValue());
    }


}

输出

Converter  = 6749695
BigInteger = -666

这里的完整代码http://ideone.com/qu9Ulw

1 个答案:

答案 0 :(得分:2)

首先,你的指数是错误的。它不是2,1,0而是0,1,2。

其次问题是标志没有被扩​​展,所以即使它适用于正值,负值也显示错误。

如果你不屏蔽最高(24位)字节,它将正确地进行符号扩展,填充最高(32位)字节,其中0x00为正值,0xFF为负值。

return (data[0] << 16) | (data[1] & 255) << 8 | (data[2] & 255);