2010-02-22 4 views
3

Ok, c'est plus d'un 'Qu'est-ce qui se passe?' qu'un problème réel. Mais étant donné mon inexpérience relative avec C, cela pourrait engendrer de plus grands problèmes.Pourquoi est-ce que j'obtiens des valeurs différentes en lisant des octets de NSData selon l'ordre dans lequel j'obtiens les octets?

Fondamentalement, je suis en train d'analyser l'en-tête d'un fichier wav et de saisir les valeurs. Dans mon dossier d'en-tête, j'ai les variables de classe définies:

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

Et la fonction dans la classe pour obtenir ces valeurs va:

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

Les plages sont définies précédemment:

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

Cela fonctionne bien et j'obtiens toutes les valeurs, mais, si je déplace l'une des lignes dans l'ordre, ou l'une des définitions de variables dans l'en-tête, elles ont une valeur complètement différente. par exemple. le wav de test sur lequel je travaille a un taux d'échantillonnage de 8000. Avec le code ci-dessus, j'obtiens la valeur correcte. Mais si je déplace la ligne qui lui attribue la valeur au-dessus de la ligne pour les canaux, je reçois 524288000. Super. Fondamentalement, si l'ordre dans lequel les variables sont données leur valeur ne correspond pas à l'ordre dans lequel elles sont définies, cela les gâche. Les plages ne semblent pas avoir d'impact sur ce comportement.

Quelqu'un sait-il ce qui se passe ici?

+0

Vous devez fournir votre code qui définit les variables de plage, car le problème est très probablement là. –

+0

Ajouté dans. Pensé à ce sujet initialement, mais puisque je pouvais changer ceux sans effet, il ne semblait pas utile. – Septih

Répondre

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

Non, NSRange ne fonctionne pas comme ça. La définition de NSRange est

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

qui signifie que le 2ème membre est une longueur, pas l'emplacement final. Sûrement vous ne voulez pas lire 23 octets dans un short (qui déborde le tampon et remplace les autres variables et provoque le phénomène que vous obtenez). Modifiez-les en

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

et réessayez.

+0

Exactement! Donc, fondamentalement, "qu'est-ce qui se passe?" le problème est juste que j'obtenais d'une manière ou d'une autre les bonnes réponses en dépit de l'horrible erreur du code :) Merci beaucoup. – Septih