5

私はJavaを使用しています。

私はバイト配列(配列の各位置に8ビット)を持っています、そして私がする必要があるのは配列の値の2つをまとめて値を取得することです。

私は自分自身をよりよく説明しようとします。オーディオファイルからオーディオデータを抽出しています。このデータはバイト配列に格納されます。各オーディオサンプルのサイズは16ビットです。配列が次の場合:

byte [] audioData;

必要なのは、1つのオーディオサンプルを取得するために、サンプルaudioData[0]とaudioData[1]から1つの値を取得することです。

誰かが私にこれを行う方法を説明できますか?

前もって感謝します。

4

9 に答える 9

7

私はJava開発者ではないので、これは完全にオフベースである可能性がありますが、ByteBufferの使用を検討しましたか?

于 2009-06-03T19:20:51.950 に答える
4

LSBがdata[0]にあると仮定します

int val;

val = (((int)data[0]) & 0x00FF) | ((int)data[1]<<8);
于 2009-06-03T19:20:12.250 に答える
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);
于 2009-06-03T20:22:18.287 に答える
1
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バイトを抽出し、最初のバイトが上位ビットで、2番目のバイトが下位ビットです(これはビッグエンディアンと呼ばれます。バイト配列にリトルエンディアンデータが含まれている場合は、シフトします。 16ビット番号の代わりに2バイト目。リトルエンディアンの32ビット番号の場合、Javaの整数はビッグエンディアンの順序に従うため、4バイトすべての順序を逆にする必要があります)。

于 2009-10-26T02:46:14.013 に答える
1

Javaでバイトの配列をビットに解析する簡単な方法は、JBBPの使用法です。

  class Parsed { @Bin(type = BinType.BIT_ARRAY) byte [] bits;}
  final Parsed parsed = JBBPParser.prepare("bit:1 [_] bits;").parse(theByteArray).mapTo(Parsed.class);

コードは、各バイトの解析されたビットを、Parsedクラスインスタンスのビット配列に8バイトとして配置します。

于 2014-08-13T11:01:45.840 に答える
0

プレオンをご覧になることをお勧めします。プレオンでは、次のように言うことができます。

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);
于 2009-10-10T09:50:28.163 に答える
0

short2バイトを論理和または論理和で(2バイト)に変換できます。

short value = ((short) audioData[0]) | ((short) audioData[1] << 8);
于 2009-06-03T19:23:17.687 に答える
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();
于 2021-03-11T15:22:55.143 に答える
-4
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:)

于 2010-11-22T01:20:29.173 に答える