Я довольно новичок в Objective-C (и сам C) и должен потреблять NSData
с выхода HTTP. Я никогда не работал с байтовыми массивами или не беспокоился о проблемах с маленькими/большими концами, и немного пытался написать следующий метод для чтения NSNumber
с указанной длиной от NSData
.Чтение NSNumber из 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;
}
NSData *data
меня и NSUInteger offset
объявлены как переменные экземпляра.
Правильно ли этот код? О чем я должен беспокоиться? Я еще не тестировал его на самом устройстве (только на симуляторе), и, похоже, он отлично работает для меня. Есть ли у вас какие-либо комментарии по этому поводу?
Спасибо!
Это RESTful API, и он действительно отвечает на коллекции сотен значений (строк и чисел). Выходной файл gziped, поэтому он имеет смысл для меня. Я на самом деле не проектировал сервер, и он не изменится, поэтому меня больше волнует, как будто моя реализация правильная. Как вы думаете, есть ли лучший способ сделать это? Благодаря! – leolobato
Спасибо за советы! Меня действительно беспокоило то, как я делал преобразование байтового массива в nsnumber, но так как вы не упомянули эту часть, похоже, что это правильно (или, по крайней мере, допустимый способ). :) – leolobato