2017-02-14 15 views
0

は私がthisを見つけたが、それは、符号なし24ビット整数のためです:DataViewで符号付き24ビット整数を設定するにはどうすればよいですか?

DataView.prototype.setUint24 = function(pos, val) { 
    this.setUint16(pos, val >> 8); 
    this.setUint8(pos+2, val & ~4294967040); // this "magic number" masks off the first 16 bits 
} 

は単純に動作していないようsetInt8ためsetInt16ためsetUint16setUint8を変更します。低レベルのバイナリに関する知識は非常に限られているので、私はいくつかの助けが必要です。私はこの機能のほとんどを理解する:

  • val >> 8 16ビット
  • pos + 2として格納するだけ最初の16ビットを保持する16ビットの整数として空間
  • の点で2つのバイトを要するからですval & ~4294967040、よくコメントがあります。

署名された値を設定するメソッドへの呼び出しを変更するだけではうまくいかない理由がわかりません/署名されていない値を設定するときにプロセスが異なる理由はわかりません。

+1

'val&〜4294967040'は愚かです。 'val&0xff'ははるかに読みやすくなります。とにかく、 'setUint24'は変更のない符号付き整数に対しても動作するはずです。 – Ryan

+0

@Ryan私は少なくとも、 "署名されていない"代替権の代わりに 'setInt16'と 'setInt8'を使う必要がありますか?私は他の何かが私のコードで間違っていると思います... – maximedupre

+0

いいえ、それは変更なしで動作するはずです。 – Ryan

答えて

0

@Ryanと@Thomasでコメントされているように、このメソッドは機能します。私が作っていたwavファイルは純粋なホワイトノイズだったので、うまくいきませんでした。この方法は機能しますが、バイトを間違った順序で設定している可能性があります(これはwavファイルでは問題ですが、他の処理では問題になります)。詳細については、Is there anything special I have to do to create a 24-bit WAV file?を参照してください。

関連する問題