背景
我正在使用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
答案 0 :(得分:2)
首先,你的指数是错误的。它不是2,1,0而是0,1,2。
其次问题是标志没有被扩展,所以即使它适用于正值,负值也显示错误。
如果你不屏蔽最高(24位)字节,它将正确地进行符号扩展,填充最高(32位)字节,其中0x00为正值,0xFF为负值。
return (data[0] << 16) | (data[1] & 255) << 8 | (data[2] & 255);