52

バイト配列に格納されたオーディオ データを取得し、それをビッグ エンディアンの short 配列に変換し、エンコードしてから、バイト配列に戻す際に問題が発生しています。これが私が持っているものです。元のオーディオ データは audioBytes2 に格納されます。代わりに、cos 関数にマイナスを付けて、デコードに同じ形式を使用しています。残念ながら、byte および short データ型の変更は交渉不可能です。

    short[] audioData = null;
    int nlengthInSamples = audioBytes2.length / 2;
    audioData = new short[nlengthInSamples];

    for (int i = 0; i < nlengthInSamples; i++) {
       short MSB = (short) audioBytes2[2*i+1];
       short LSB = (short) audioBytes2[2*i];
       audioData[i] = (short) (MSB << 8 | (255 & LSB));
    }

    int i = 0;
    while (i < audioData.length) {
        audioData[i] = (short)(audioData[i] + (short)5*Math.cos(2*Math.PI*i/(((Number)EncodeBox.getValue()).intValue())));
        i++;
    }

    short x = 0;
    i = 0;
    while (i < audioData.length) {
        x = audioData[i];
        audioBytes2[2*i+1] = (byte)(x >>> 0);
        audioBytes2[2*i] = (byte)(x >>> 8);
        i++;
    }

これを機能させるために考えられることはすべて実行しましたが、最も近いのは、他のすべてのエンコード/デコードを機能させることであり、その理由はわかりません。助けてくれてありがとう。

4

6 に答える 6

103

また、ByteBuffer を試すことをお勧めします。

byte[] bytes = {};
short[] shorts = new short[bytes.length/2];
// to turn bytes to shorts as either big endian or little endian. 
ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts);

// to turn shorts back to bytes.
byte[] bytes2 = new byte[shortsA.length * 2];
ByteBuffer.wrap(bytes2).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().put(shortsA);
于 2011-04-11T18:49:41.213 に答える
12
public short bytesToShort(byte[] bytes) {
     return ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getShort();
}
public byte[] shortToBytes(short value) {
    return ByteBuffer.allocate(2).order(ByteOrder.LITTLE_ENDIAN).putShort(value).array();
}
于 2013-08-08T06:30:04.520 に答える
6

いくつかの ByteBuffers はどうですか?

byte[] payload = new byte[]{0x7F,0x1B,0x10,0x11};
ByteBuffer bb = ByteBuffer.wrap(payload).order(ByteOrder.BIG_ENDIAN);
ShortBuffer sb = bb.asShortBuffer();
while(sb.hasRemaining()){
  System.out.println(sb.get());
}
于 2011-04-11T18:48:11.497 に答える
2

あなたのコードは、ビッグではなく、リトルエンディアンのショートを行っています。MSB と LSB のインデックスを入れ替えました。

ビッグエンディアンの short を使用しているため、独自のデコードを行うのではなく、反対側で ByteArrayInputStream (および DataOutputStream/ByteArrayOutputStream) にラップされた DataInputStream を使用できます。

他のすべてのデコードが機能している場合は、バイト数が奇数であるか、他の場所でオフバイワンエラーが発生しているため、他のすべてのパスでミスが修正されていると思います。

最後に、i+=2 で配列をステップ実行し、2 を乗算するのではなく、MSB= arr[i] と LSB=arr[i+1] を使用しますが、それは私だけです。

于 2011-04-11T18:30:05.607 に答える
-1

バイトの読み取りと書き込みの間でバイト順を交換しているようです (これが意図的かどうかは不明です)。

于 2011-04-11T18:34:23.857 に答える