2011-04-11 15 views
34

バイト配列に格納されたオーディオデータをビッグエンディアンの短い配列に変換してエンコードし、バイト配列に戻すときに問題が発生します。ここに私が持っているものがあります。元のオーディオデータはaudioBytes2に格納されます。私は代わりにcos関数のマイナスを使ってデコードするのと同じフォーマットを使用しています。残念ながら、バイトとショートのデータ型を変更することはできません。バイト配列を短い配列に戻してJavaに戻す

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++; 
    } 

私はこの仕事をするために私は考えることができるすべてを行っているが、私が来ている最も近い、それは他のすべてのエンコード/デコードを動作するようになっていると私は理由は分かりません。助けてくれてありがとう。

+1

あなたはどんな問題を抱えていますか? –

+2

はビッグエンディアンかリトルエンディアンですか?この変換を処理するには 'java.nio.ByteBuffer'が必要です。 –

+0

[短い配列をバイト配列に変換する方法]の複製があります(http://stackoverflow.com/questions/10804852/how-to-convert-short-array-to-byte-array) –

答えて

1

あなたのコードは大きなものではなく、リトルエンディアンのショーツをやっています。 MSBとLSBのインデックスがスワップされました。

ビッグエンディアンのショートを使用しているので、独自のデコードではなく、もう一方の端でByteArrayInputStream(およびDataOutputStream/ByteArrayOutputStream)をラップしたDataInputStreamを使用している可能性があります。

他のすべてのデコードが動作している場合は、バイト数が奇数であるか、別の場所でオフラインでエラーが発生していると思います。

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

+0

私は実際に何かを使用していますaudioInputStreamを使用して再変換した場合と同様です。 – Aaron

-1

バイトの読み込みと書き戻し(意図的であるかどうかわからない)の間に、バイト順を入れ替えているようです。

4

いくつかの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()); 
} 
72

また、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); 
+2

short [] audioData = ByteBuffer.wrap(audioBytes2).order(ByteOrder.BIG_ENDIAN).asShortBuffer()。array(); UnsupportedOperationExceptionをスローします。 – Aaron

+1

@Aaron - はい、しかし*何が例外をスローしますか? (ヒント: 'ShortBuffer'は基になる' ByteBuffer'に* view *として機能し、 'get()'メソッドはあなたが望むものを正確に行うべきです)。 – kdgregory

+0

@kdgregory、ありがとうございました。 ;) –

8
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(); 
} 
0

バイト[2]バイト。 0x30; 0x30; r =(r < < 8)| (バイト[0] & 0xFF);

short s =(short)r;

関連する問題