2010-06-21 7 views
0

En utilisant des frameworks de fondation et de cacao sur Mac, j'essaye de convertir un objet NSData en un nombre humainement compréhensible. Supposons que l'objet NSData est une image de NPIXEL. Je sais que les données binaires sont codées en big endian et représentent un entier de 32 bits (pour être plus précis, 32 bits deux complètent l'entier). J'écris le morceau de code ci-dessous pour convertir le NSData dans un tableau int. Mais la valeur obtenue est complètement fausse (cela ne signifie pas que la mesure est mauvaise, j'ai utilisé un logiciel spécial pour lire les données et la valeur donnée par le logiciel est différente de celle que j'ai eu avec mon code).Problème lors de la conversion de NSData en int

-(int *) GetArrayOfLongInt 
{ 
    //Get the total number of element into the Array 
    int Nelements=[self NPIXEL]; 
    //CREATE THE ARRAY 
    int array[Nelements]; 
    //FILL THE ARRAY 
    int32_t intValue; 
    int32_t swappedValue; 
    double Value; 
    int Nbit = abs(BITPIX)*GCOUNT*(PCOUNT + Nelements); Nbit/=sizeof(int32_t); 
    int i=0; 
    int step=sizeof(int32_t); 
    for(int bit=0; bit < Nbit; bit+=step) 
    { 
    [Img getBytes:&swappedValue range:NSMakeRange(bit,step)]; 
    intValue= NSSwapBigIntToHost(swappedValue); 
    array[i]=intValue; 
    i++; 
    } 
    return array; 
} 

Ce morceau de code (avec changement mineur) fonctionnent parfaitement lorsque les données binaires représentent float ou double, mais je ne t when it is 16,32 or 64 bit integer. I also tried changing NSSapBigIntToHost into NSSwapLittleInttoHost`. J'ai même essayé avec longtemps, mais les résultats sont toujours les mêmes, j'ai de mauvaises valeurs. Quel mal je fais? PS: Certaines variables de mon code sont déjà définies ailleurs dans mon programme. BITPIX est la taille de chaque pixel. Dans ce cas 32. GCOUNT est égal à 1, PCOUNT 0 et Nelements est le nombre total de pixels que je devrais avoir dans mon image.

Répondre

0

Renvoyer un pointeur sur une variable locale est une très mauvaise idée . array peut être écrasé à tout moment (ou si vous écrivez via le pointeur, vous risquez de corrompre la pile). Vous voulez probablement quelque chose comme:

// CREATE THE ARRAY 
int *array = malloc(Nelements * sizeof(int)); 

Votre algorithme semble également un peu exagéré. Pourquoi ne pas copier tout le tableau de l'objet NSData, puis byteswap les entrées en place? Quelque chose comme:

int32_t length = [Img length]; 
int32_t *array = malloc(length); 

[Img getBytes:array length:length]; 

for (i = 0; i < length/sizeof(int32_t); i++) 
{ 
    array[i] = NSSwapBigIntToHost(array[i]); 
} 
+0

Merci pour le conseil, vous avez raison, il semble plus propre. Mais peu de question, vous créez un tableau de la taille de 'length' mais en réalité vous remplissez seulement le cas' length/sizeof (int_32) 'de votre tableau. Ne devriez-vous pas faire 'int32_t * array = malloc (longueur/sizeof (int_32));' –

+0

@William, non, le tableau doit être 'length' long octets. Si vous divisez, vous finirez avec un tableau qui ne représente que 25% de la taille dont vous avez besoin. Le code que j'ai montré là alloue 'length' bytes, ce qui est l'espace pour les entiers' longueur/sizeof (int32_t) '. –

+0

CITATION: "Renvoyer un pointeur vers une variable locale est une très mauvaise idée." Je suis d'accord. Mais, j'ai essayé plusieurs choses, comme 'int (* tableau) [Nelements]; ... retour * tableau; ' mais, compilateur n'est pas si heureux. En réalité, il n'est pas si heureux avec «array retrun», aussi. Mais, je me concentrais principalement sur essayer de convertir correctement le NSdata avant de résoudre ce problème. –

Questions connexes