3

わかりました、これは「一体何が起こっているのか」ということです。実際の問題よりも。しかし、Cについての私の相対的な経験がないことを考えると、それはより大きな問題を示唆する可能性があります。

基本的に、私はwavファイルのヘッダーを解析して値を取得しています。ヘッダーファイルには、クラス変数が定義されています。

short channels;
int sampleRate;
int bytesPerSecond;
short bytesPerSample;
short bitsPerSample;
unsigned int size;  

そして、これらの値を取得するためのクラスの関数は次のようになります。

NSData * fileData = [[NSData alloc] initWithContentsOfFile:filePath];
[fileData getBytes:&channels range:CHANNELS_R];
[fileData getBytes:&sampleRate range:SAMPLES_R];
[fileData getBytes:&bytesPerSecond range:BYTES_PER_SEC_R];
[fileData getBytes:&bytesPerSample range:BYTES_PER_SAMPLE_R];
[fileData getBytes:&bitsPerSample range:BITS_PER_SAMPLE_R];
[fileData getBytes:&size range:LENGTH_R];

範囲は前に定義されています:

const NSRange CHANNELS_R = {22,23};
const NSRange SAMPLES_R = {24,27};
const NSRange BYTES_PER_SEC_R = {28,31};
const NSRange BYTES_PER_SAMPLE_R = {32,33};
const NSRange BITS_PER_SAMPLE_R = {34,35};
const NSRange LENGTH_R = {40,43};

これは正常に機能し、すべての値を取得しますが、行の1つを順番に移動するか、ヘッダーの変数定義の1つを移動すると、完全に異なる値が取得されます。たとえば、私が取り組んでいるテストwavのサンプルレートは8000です。上記のコードを使用すると、正しい値が得られます。しかし、それに値を割り当てる行をチャネルの行より上に移動すると、524288000になります。すばらしい。基本的に、変数に値が与えられる順序が、変数が定義される順序と一致しない場合、変数は混乱します。範囲はこの動作に影響を与えないようです。

誰かがここで何が起こっているのかについての手がかりを持っていますか?

4

1 に答える 1

6
const NSRange CHANNELS_R = {22,23};
const NSRange SAMPLES_R = {24,27};
const NSRange BYTES_PER_SEC_R = {28,31};
const NSRange BYTES_PER_SAMPLE_R = {32,33};
const NSRange BITS_PER_SAMPLE_R = {34,35};
const NSRange LENGTH_R = {40,43};

いいえ、NSRangeそのようには機能しません。の定義NSRange

typedef struct _NSRange {
   NSUInteger location;
   NSUInteger length;
} NSRange;

つまり、2番目のメンバーは長さであり、終了位置ではありません。確かに、23バイトをaに読み込みたくはありませんshort(これにより、バッファーがオーバーフローし、他の変数がオーバーライドされて、発生する現象が発生します)。それらをに変更します

const NSRange CHANNELS_R = {22,2};
const NSRange SAMPLES_R = {24,4};
const NSRange BYTES_PER_SEC_R = {28,4};
const NSRange BYTES_PER_SAMPLE_R = {32,2};
const NSRange BITS_PER_SAMPLE_R = {34,2};
const NSRange LENGTH_R = {40,4};

そしてさらに試みる。

于 2010-02-22T13:06:23.207 に答える