Почему я получаю разные значения при чтении байтов из NSData в зависимости от того, в каком порядке я получаю байты?

Хорошо, это больше похоже на «Что, черт возьми, происходит?» чем реальная проблема. Но, учитывая мою относительную неопытность в 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. Отлично. По сути, если порядок, в котором переменным присваиваются их значения, не соответствует порядку, в котором они определены, это все портит. Диапазоны, кажется, не имеют никакого влияния на это поведение.

Кто-нибудь знает, что здесь происходит?


person Septih    schedule 22.02.2010    source источник
comment
Вам нужно предоставить свой код, который определяет переменные диапазона, так как проблема, скорее всего, там.   -  person Alex Brown    schedule 22.02.2010
comment
Добавил их. Сначала думал об этом, но, поскольку я мог изменить их без эффекта, это не казалось стоящим.   -  person Septih    schedule 22.02.2010


Ответы (1)


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 байта в 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};

и попробуй еще раз.

person kennytm    schedule 22.02.2010
comment
Вы правы! Так в основном, что, черт возьми, происходит? проблема в том, что я каким-то образом получал правильные ответы, несмотря на ужасно неправильный код :) Большое спасибо. - person Septih; 22.02.2010