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.
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));' –
@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) '. –
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. –