質問

私はJavaを使って作業しています。

バイト配列 (配列の各位置に 8 ビット) があり、配列の値を 2 つまとめて値を取得する必要があります。

もっとわかりやすく説明してみます。音声ファイルから音声データを抽出しています。このデータはバイト配列に格納されます。各オーディオ サンプルのサイズは 16 ビットです。配列が次の場合:

byte[] オーディオデータ;

必要なのは、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();

上記のコードの利点は、あなたが同じように「データ」の残りを読み続けることができるということです。

ちょうど2つの値のための簡単なソリューションは次のようになります。

short value = (short) ((audioData[0]<<8) | (audioData[1] & 0xff));

この単純な解決策は、(これはビッグエンディアンとして知られている2つのバイトを抽出し、上位ビット及び第二のバイトの下位ビットである第1バイトと一緒にピースして、あなたのバイト配列は、リトルエンディアンデータ含まれている場合、あなたは16ビットの数値のための代わりの上に第2のバイトをシフトする、リトルエンディアン32ビットの数値のために、あなたはJavaの整数はビッグエンディアン順序に従っているため、すべての4バイトの順序を逆にする必要があります)。

ビットバイトのアレイを解析する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つのバイトとして各バイトの解析されたビットを配置します。

次の2つのバイトを一緒にする、または、論理によってshort(2バイト)に変換することができます:

short value = ((short) audioData[0]) | ((short) audioData[1] << 8);

私はあなたが 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);
byte myByte = 0x5B;

boolean bits = new boolean[8];

for(int i = 0 ; i < 8 ; i++)
    bit[i] = (myByte%2 == 1);

の結果は0と1 1=TRUE0=FALSEのアレイである。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top