Как преобразовать байты NSData в NSNumber или NSInteger? - PullRequest
2 голосов
/ 10 февраля 2012

Существует специальный метод NSString initWithData для захвата битов и их преобразования в строку. Тем не менее, я не нашел этого в NSNumber классе ref. В настоящее время я получаю необработанные данные (байты) с сервера в формате NSData. Я знаю, как сделать это в C, используя указатели memcpy и int. Но мне любопытно, каковы удобные методы для этого прямо с NSData. Нет преобразования не требуется. Например, я получаю 00000010 байт, и мне нужно превратить его в NSNumber со значением 2 или NSInteger.

Ответы [ 4 ]

8 голосов
/ 10 февраля 2012

NSData - это просто блок для байтов, и он не знает, какие данные в нем содержатся.NSString 'initWithData:encoding: метод является обратным (он делает противоположное) этого метода:

- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding

Поэтому, чтобы полностью ответить на ваш вопрос, важно знать, как ваши цифры были изначально приведеныNSData объект.Как только вы узнаете функцию кодирования, вы найдете обратную функцию.

Из того, что вы включили в вопрос, может быть несколько разных решений.Тем не менее, вы, вероятно, сможете использовать что-то в следующих строках для преобразования в пригодный для использования числовой формат, используя getBytes:length: в вашем объекте NSData.Например,

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

Вы можете изменить тип decodedInteger на любой подходящий для байтов в NSData объекте.

1 голос
/ 18 августа 2015

NСтолько на помощь:

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

Документы предупреждают об использовании NSScanner для локализованных десятичных чисел, но в данном случае это не имеет значения.

1 голос
/ 10 февраля 2012

Попробуйте это:

NSNumber *num = [NSKeyedUnarchiver unarchiveObjectWithData:numberAsNSData]; 

Edit:

Как указал Матиас Баух, это не сработает в вашем случае. Это работает, только если ваш объект NSNumber был заархивирован в объекты NSData.

0 голосов
/ 10 декабря 2013

Вот ответ

//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;
}

Подробнее см. https://stackoverflow.com/a/20497490/562812

...