8
votes

Obj-C Comment convertir Nsdata en une gamme d'INTS?

J'ai un objet Nsdata qui tient un tas d'INTS. Comment puis-je les sortir et dans un nsarray?

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.

Désolé pour la question fondamentale, mais j'apprends toujours la façon de faire les choses Obj-C :)


0 commentaires

4 Réponses :


0
votes

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 (32 bits Litte Endian à l'endianness indigène)). XXX


3 commentaires

Je pense que int est toujours 4 octets long sur x86_64. C'est long qui correspond à la taille du mot. Ou plus précisément, int 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 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



2
votes

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


1 commentaires

La ligne 2 de votre proposition donne un avertissement: initialisation 'int *' avec une expression de type 'const Void *' rejeter les qualificatifs . Qu'est-ce que ça veut dire?



14
votes

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


0 commentaires

2
votes

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. XXX


0 commentaires