我正在使用java。
我有一个字节数组(数组的每个位置都有8位),我需要做的是将数组中的2个值放在一起并得到一个值。
我会试着更好地解释自己;我正在从音频文件中提取音频数据。该数据存储在字节数组中。每个音频样本的大小为16位。如果数组是:
byte [] audioData;
我需要从示例audioData [0]和audioData [1]中获取1个值,以获得1个音频样本。
有谁能解释我怎么做?
提前致谢。
答案 0 :(得分:7)
我不是Java开发人员所以这可能完全偏离基础,但你考虑使用ByteBuffer吗?
答案 1 :(得分:4)
假设LSB位于数据[0]
int val;
val = (((int)data[0]) & 0x00FF) | ((int)data[1]<<8);
答案 2 :(得分:1)
如前所述,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);
答案 3 :(得分:1)
ByteInputStream b = new ByteInputStream(audioData);
DataInputStream data = new DataInputStream(b);
short value = data.readShort();
上述代码的优点是您可以以相同的方式继续阅读其余的“数据”。
只有两个值的简单解决方案可能是:
short value = (short) ((audioData[0]<<8) | (audioData[1] & 0xff));
这个简单的解决方案提取两个字节,并将它们拼凑在一起,第一个字节是高阶位,第二个字节是低阶位(这被称为Big-Endian;如果你的字节数组包含Little-Endian数据,您将第二个字节移位而不是16位数;对于Little-Endian 32位数,您必须反转所有4个字节的顺序,因为Java的整数遵循Big-Endian排序。)
答案 4 :(得分:1)
更简单的Java方法是将字节数组解析为位JBBP usage
class Parsed { @Bin(type = BinType.BIT_ARRAY) byte [] bits;}
final Parsed parsed = JBBPParser.prepare("bit:1 [_] bits;").parse(theByteArray).mapTo(Parsed.class);
代码将每个字节的已解析位作为8字节放在Parsed类实例的位数组中
答案 5 :(得分:0)
您可以通过逻辑或两个字节一起转换为short
(2个字节):
short value = ((short) audioData[0]) | ((short) audioData[1] << 8);
答案 6 :(得分:0)
我建议你看看Preon。在Preon,你可以说出这样的话:
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);
答案 7 :(得分:0)
您可以这样做,无需库或外部类。
byte myByte = (byte) -128;
for(int i = 0 ; i < 8 ; i++) {
boolean val = (myByte & 256) > 0;
myByte = (byte) (myByte << 1);
System.out.print(val ? 1 : 0);
}
System.out.println();
答案 8 :(得分:-4)
byte myByte = 0x5B;
boolean bits = new boolean[8];
for(int i = 0 ; i < 8 ; i++)
bit[i] = (myByte%2 == 1);
结果是一个零和一组1=TRUE
和0=FALSE
:)