Je suis assez nouveau à Objective-C (et C lui-même) et besoin de consommer un NSData
à partir d'une sortie HTTP. Je n'ai jamais vraiment travaillé avec des tableaux d'octets ou je devais m'inquiéter de problèmes petits/gros, et j'ai eu du mal à écrire la méthode suivante pour lire un NSNumber
avec une longueur spécifiée de NSData
.Lire NSNumber de NSData
- (NSNumber *)readNumberWithLength:(NSUInteger)length
{
Byte k[length];
[data getBytes:k range:NSMakeRange(offset, length)]; // big endian byte array representing a number
offset += length;
NSNumber *number;
if (length==4) {
number = [NSNumber numberWithUnsignedInt:CFSwapInt32BigToHost(*(uint32_t *)k)];
} else if (length==2) {
number = [NSNumber numberWithUnsignedShort:CFSwapInt16BigToHost(*(uint16_t *)k)];
} else if (length==1) {
number = [NSNumber numberWithUnsignedChar:*(uint8_t *)k];
} else if (length==8) {
number = [NSNumber numberWithUnsignedLongLong:CFSwapInt64BigToHost(*(uint64_t *)k)];
} else {
number = [NSNumber numberWithInt:0];
}
return number;
}
Je NSData *data
et NSUInteger offset
a déclaré que les variables d'instance.
Ce code est-il correct? Y a-t-il quelque chose dont je devrais me soucier? Je ne l'ai pas encore testé sur un appareil réel (uniquement sur le simulateur) et cela semble fonctionner correctement pour moi. Avez-vous des commentaires à ce sujet?
Merci!
Il s'agit d'une API RESTful qui répond vraiment aux collections avec des centaines de valeurs (chaînes et nombres). La sortie est gzipée, donc ça a du sens pour moi. Je n'ai pas vraiment conçu le serveur et ça ne va pas changer, donc je suis plus inquiet que si ma mise en œuvre est correcte. Pensez-vous qu'il existe une meilleure façon de faire cela? Merci! – leolobato
Merci pour les conseils! J'étais en fait préoccupé par la façon dont je faisais la conversion du tableau d'octets en nsnumber, mais puisque vous n'avez pas mentionné cette partie, on dirait que c'est correct (ou du moins un moyen valable). :) – leolobato