2010-02-22 1 views
3

좋아요, 이것은 '도대체 무슨 일이야?' 실제 문제보다. 그러나 C에 대한 나의 상대적인 미숙함을 고려할 때, 그것은 더 큰 문제들을 암시 할 수 있습니다.바이트를 가져 오는 순서에 따라 NSData에서 바이트를 읽을 때 다른 값을 얻는 이유는 무엇입니까?

기본적으로 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이됩니다. 기본적으로 변수에 주어진 값의 순서가 정의 된 순서와 일치하지 않으면 변수의 순서가 엉망입니다. 범위는이 동작에 영향을 미치지 않는 것 같습니다.

여기에 무슨 일이 일어나는가에 대한 단서가 누구에게 있습니까?

+0

문제가있을 가능성이 높으므로 범위 변수를 정의하는 코드를 제공해야합니다. –

+0

처음에 그것에 대해 생각했지만, 효과가없는 것을 변경할 수 있었기 때문에 보람이 없었습니다. – Septih

답변

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의 정의는 제 2 부재를 의미

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

의 길이가 아니라 최종 위치이다. 확실히 당신은 short (버퍼를 오버 플로우시키고 다른 변수를 오버라이드하고 당신이 얻는 현상을 야기 함)으로 23 바이트를 읽는 것을 원하지 않습니다. 숫자를

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

으로 변경하고 다시 시도하십시오.

+0

바로 당신입니다! 그래서 기본적으로 "도대체 어떻게 된거야?" 문제는 내가 코드를 끔찍하게 잘못하고 있음에도 불구하고 어떻게 든 올바른 답을 얻고 있다는 것입니다. :) 대단히 감사합니다. – Septih