我用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);
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=TRUE0=FALSE:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top