Преобразование NSdata в байты и затем преобразование первых n байтов в int - PullRequest
1 голос
/ 07 сентября 2011

У меня есть объект NSData. Сначала я хочу преобразовать объект NSData в байты, затем прочитать первые четыре байта в этом объекте NSData и затем преобразовать первые четыре байта в их эквивалентные целые значения. Есть идеи, как это сделать?

Как насчет преобразования всех четырех байтов в одно положительное целое число?

Ответы [ 3 ]

5 голосов
/ 07 сентября 2011

Получение int из необработанных данных неоднозначно: откуда данные берутся? Какой размер вы хотите, чтобы ваш int? Вы хотите, чтобы они были подписаны или не подписаны? Какой порядок байтов вы ожидаете?

Итак, вот один сценарий: данные, которые вы получаете, поступают из потока, закодированного внешним процессом, который подает 32-разрядные целые числа со знаком в порядке с прямым порядком байтов. Вот как это можно сделать:

NSData *dataFromStream = functionThatReturnsNSData();
SInt32 *signedInt32pointer = [dataFromStream bytes];
SInt32 unSwappedInt32 = *signedInt32pointer;
SInt32 reorderedInt32 = CFSwapInt32BigToHost(unSwappedInt32);

RTFM Разделы, посвященные упорядочению байтов и замене байтов в Руководстве по программированию управления памятью для Core Foundation.

4 голосов
/ 07 сентября 2011

Это довольно просто.Используйте bytes, чтобы получить байты, а затем приведите к unsigned char*

unsigned char *n = [yourNSData bytes];
int value1 = n[0];
int value2 = n[1];
int value3 = n[2];
int value4 = n[3];

Обновление

Чтобы превратить это в один int, предполагается, что bytes содержит действительный int:

int result = *(int *)n;
0 голосов
/ 27 августа 2014
int n ; // first n bytes
NSData *data; // your data

NSData *subData = [data subdataWithRange:NSMakeRange(0, n)]; // make sure if data has n bytes

NSString *stringData = [subData description];
stringData = [stringData substringWithRange:NSMakeRange(1, [stringData length]-2)];

unsigned dataAsInt = 0;
NSScanner *scanner = [NSScanner scannerWithString: stringData];
[scanner scanHexInt:& dataAsInt];
...