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
.
Réponses
Trop de publicités?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.
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