3 votes

Comment convertir les octets de NSData en NSNumber ou NSInteger ?

Il y a un spécial NSString initWithData méthode pour saisir des bits et les convertir en chaîne. Cependant, je n'ai pas trouvé cela dans NSNumber référence de classe. Actuellement, je reçois des données brutes (octets) d'un serveur dans le format NSData format. Je sais comment faire ça en C, en utilisant memcpy y int les pointeurs. Mais je suis curieux de savoir quelles sont les méthodes pratiques pour faire cela directement à partir de NSData . Aucune conversion n'est nécessaire. Par exemple, j'obtiens 00000010 et j'ai besoin de le transformer en NSNumber de valeur 2, ou NSInteger .

8voto

ikuramedia Points 2909

NSData n'est qu'un seau d'octets et n'a aucune connaissance des données qu'il contient. NSString 's initWithData:encoding: est une réciproque (elle fait le contraire) de cette méthode :

- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding

Par conséquent, pour répondre pleinement à votre question, il est important de savoir comment vos chiffres ont été initialement contraints à une NSData objet. Une fois que l'on connaît la fonction d'encodage, il faut chercher la fonction réciproque.

D'après ce que vous avez inclus dans la question, il peut y avoir un certain nombre de solutions différentes. Cependant, vous serez probablement en mesure d'utiliser quelque chose du genre de ce qui suit pour convertir dans un format numérique utilisable à l'aide de getBytes:length: sur votre objet NSData. Par exemple

NSUInteger decodedInteger;
[myDataObject getBytes:&decodedInteger length:sizeof(decodedInteger)];

Vous pouvez changer le type de decodedInteger à ce qui est approprié pour les octets dans vos NSData objet.

1voto

mbh Points 2423

Essayez ça :

NSNumber *num = [NSKeyedUnarchiver unarchiveObjectWithData:numberAsNSData]; 

Edit :

Comme l'a souligné Matthias Bauch, cela ne fonctionnera pas dans votre cas. Cela ne fonctionne que si votre objet NSNumber a été archivé dans des objets NSData.

1voto

Elise van Looij Points 2254

NSString à la rescousse :

const unsigned char *bytes = [serverData bytes];
NSInteger aValue = [NSString stringWithFormat:@"%2x", bytes[0]].integerValue;

La documentation met en garde contre l'utilisation de NSScanner pour les nombres décimaux localisés, mais cela n'a pas d'importance dans ce cas.

-3voto

Jeeva Points 111

Voici la réponse

//Integer to NSData
+(NSData *) IntToNSData:(NSInteger)data
{
    Byte *byteData = (Byte*)malloc(4);
    byteData[3] = data & 0xff;
    byteData[2] = (data & 0xff00) >> 8;
    byteData[1] = (data & 0xff0000) >> 16;
    byteData[0] = (data & 0xff000000) >> 24;
    NSData * result = [NSData dataWithBytes:byteData length:4];
    NSLog(@"result=%@",result);
    return (NSData*)result;
}

se référer à https://stackoverflow.com/a/20497490/562812 pour plus de détails

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X