質問
私は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);
、Javaはこれであなたを助けるためのクラスを持っています。あなたはのByteBuffer を使用して、配列をラップすることができますA>その後、 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();
上記のコードの利点は、あなたが同じように「データ」の残りを読み続けることができるということです。
ちょうど2つの値のための簡単なソリューションは次のようになります。
short value = (short) ((audioData[0]<<8) | (audioData[1] & 0xff));
この単純な解決策は、(これはビッグエンディアンとして知られている2つのバイトを抽出し、上位ビット及び第二のバイトの下位ビットである第1バイトと一緒にピースして、あなたのバイト配列は、リトルエンディアンデータ含まれている場合、あなたは16ビットの数値のための代わりの上に第2のバイトをシフトする、リトルエンディアン32ビットの数値のために、あなたはJavaの整数はビッグエンディアン順序に従っているため、すべての4バイトの順序を逆にする必要があります)。
。簡単な方法は、 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=TRUE
と0=FALSE
のアレイである。)