题
我用java工作。
我有一个字节阵列(在阵列的每个位置8位)和我所需要做的是放在一起数组的值的2和得到的值。
我会试着更好地解释自己;我从音频文件中提取音频数据。这个数据被存储在一个字节数组。每个音频样本的尺寸为16位。如果阵列是:
字节[] audioData;
我需要的是获得从样品1个值audioData [0]和audioData [1]为了得到1个音频样本。
任何人都可以解释我是如何做到这一点?
预先感谢。
解决方案
我不是一个Java开发人员因此这可能是完全关闭基地,但你有没有考虑使用的字节缓冲区?
其他提示
假设LSB是在数据[0]
int val;
val = (((int)data[0]) & 0x00FF) | ((int)data[1]<<8);
如前所说,Java有类来帮助你们。你可以用的ByteBuffer 包装您的数组一>然后得到一个 IntBuffer 一>视图它。
ByteBuffer bb = ByteBuffer.wrap(audioData);
// optional: bb.order(ByteOrder.BIG_ENDIAN) or bb.order(ByteOrder.LITTLE_ENDIAN)
IntBuffer ib = bb.asIntBuffer();
int firstInt = ib.get(0);
ByteInputStream b = new ByteInputStream(audioData);
DataInputStream data = new DataInputStream(b);
short value = data.readShort();
上面的代码的优点是,可以保持以同样的方式读出“数据”的其余部分。
为只是两个值的更简单的解决方案可能是:
short value = (short) ((audioData[0]<<8) | (audioData[1] & 0xff));
这个简单的解决方案中提取两个字节,且与第一个字节是高阶比特和第二字节的低阶位一起片它们(这被称为大端;如果您的字节数组含有小端数据,您会超过代替16位数字的第二个字节移位;对于小端32位数字,你将不得不逆转所有4个字节的顺序,因为Java的整数遵循大端排序)
在Java中
更简单的方法来解析字节数组的比特是 JBBP用法
class Parsed { @Bin(type = BinType.BIT_ARRAY) byte [] bits;}
final Parsed parsed = JBBPParser.prepare("bit:1 [_] bits;").parse(theByteArray).mapTo(Parsed.class);
代码将每个字节的比特解析为放置所解析的类实例的比特阵列
在8个字节可以通过转换成short
(2个字节)逻辑或-ING两个字节一起:
short value = ((short) audioData[0]) | ((short) audioData[1] << 8);
我建议你看一看前子。在前子,你就可以说是这样的:
class Sample {
@BoundNumber(size="16") // Size of the sample in bits
int value;
}
class AudioFile {
@BoundList(size="...") // Number of samples
Sample[] samples;
}
byte[] buffer = ...;
Codec<AudioFile> codec = Codecs.create(AudioFile.class);
AudioFile audioFile = codec.decode(buffer);
byte myByte = 0x5B;
boolean bits = new boolean[8];
for(int i = 0 ; i < 8 ; i++)
bit[i] = (myByte%2 == 1);
结果是零和一的阵列,其中1=TRUE
和0=FALSE
:)
不隶属于 StackOverflow