gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:13:54 24 4
gpt4 key购买 nike

背景

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

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

问题

我在 stackoverflow 上找到的关于 3 bytes to int 的示例都没有给出想要的结果。检查 bytesToInt3 方法。

问题

有什么明显的事情我做错了吗?

return new BigInteger(byte[] data).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

最佳答案

首先,你的索引是错误的。不是 2, 1, 0,而是 0, 1, 2。

第二个问题是符号没有被扩展,所以即使它适用于正值,负值也会显示错误。

如果您不屏蔽最高(24 位)字节,它将正确地进行符号扩展,用 0x00(表示正值)或 0xFF(表示负值)填充最高(32 位)字节。

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

关于java - 3 个字节到整数的示例都不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40618403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com