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

这工作得很好,我得到了所有的值,但是,如果我按顺序向上移动其中一行,或者标题中的变量定义之一,它们会得到一个完全不同的值。例如,我正在处理的测试 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;

这意味着第二个成员是一个长度,而不是结束位置。当然,您不想将 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 回答