J'ai un objet Nsdata qui tient un tas d'INTS. Comment puis-je les sortir et dans un nsarray? P>
La structure de la mémoire dans la NSDATA est de 32 bits Int dans la commande petite-Endian, un juste après l'autre. P>
Désolé pour la question fondamentale, mais j'apprends toujours la façon de faire les choses Obj-C :) p>
4 Réponses :
Une solution possible ci-dessous.
Prendre en compte une endansnicité, recherchez la référence de Core Endian dans le Xcode DOC Set (vous utiliseriez probablement Endians32_lton Strong> (32 bits Litte Endian à l'endianness indigène)).
Je pense que int code> est toujours 4 octets long sur x86_64. C'est
long code> qui correspond à la taille du mot. Ou plus précisément,
int code> est dépendant du compilateur, mais dans GCC et Scrang sur toutes les architectures de support de cacao, il y aura 4 octets. Néanmoins,
int32_t code> serait plus approprié (et vous pouvez voir ce que j'ai utilisé dans ma réponse).
J'ai écrit le code sur x86_64 - INT est toujours 4 octets longtemps. Mais vous avez les deux raison, int32_t est plus approprié.
Nsinteger est celui qui change pour x86_64
On dirait qu'il existe des moyens plus propres de faire ce que vous essayez de faire, mais cela devrait fonctionner:
NSData *data = ...; // Initialized earlier int *values = [data bytes], cnt = [data length]/sizeof(int); for (int i = 0; i < cnt; ++i) NSLog(@"%d\n", values[i]);
La ligne 2 de votre proposition donne un avertissement: initialisation 'int *' avec une expression de type 'const Void *' rejeter les qualificatifs code>. Qu'est-ce que ça veut dire?
Vous pouvez utiliser les fonctions définies dans osbyteorder.h code> pour faire face à l'endansnité. En plus de cet ennemi, il s'agit vraiment d'une question de saisir le tampon d'octet et de l'itération de celui-ci.
// returns an NSArray containing NSNumbers from an NSData
// the NSData contains a series of 32-bit little-endian ints
NSArray *arrayFromData(NSData *data) {
void *bytes = [data bytes];
NSMutableArray *ary = [NSMutableArray array];
for (NSUInteger i = 0; i < [data length]; i += sizeof(int32_t)) {
int32_t elem = OSReadLittleInt32(bytes, i);
[ary addObject:[NSNumber numberWithInt:elem]];
}
return ary;
}
Cette réponse est très similaire à d'autres réponses ci-dessus, mais je l'ai trouvée instructive de jouer avec la coulée des octets Nsdata Retour à une matrice INT32_T []. Ce code fonctionne correctement sur un processeur Little-Endian (x64 dans mon cas) mais serait mal silencieux sur Big-Endian (PPC) car la représentation des octets serait Big-Endian.