Преобразование NSInteger и NSString в массив байтов

Мне нужно представить NSInteger и NSString в массив байтов. Ниже приведены образцы того, что я ищу.

Для того, как это harcodings работает нормально. Я хочу сделать это через код. Любая подсказка.

Во-первых, NSInteger в байты Hex:

NSInteger test = 1;
unsigned char byte[] = { 0x00, 0x01 };

NSInteger test = 16;
unsigned char byte[] = { 0x00, 0x10 };
NSData *data = [NSData dataWithBytes:byte length:sizeof(byte)];

Во-вторых, NSString в байты Hex:

NSString *test = @"31C5B562-BD07-4616-BCBD-130BA6822790";
unsigned char byte[] = {0x31, 0xC5, 0xB5, 0x62, 0xBD, 0x07, 0x46, 0x16, 0xBC, 0xBD, 0x13, 0x0B, 0xA6, 0x82, 0x27, 0x90};
NSData *data = [NSData dataWithBytes:byte length:sizeof(byte)];

Я пробовал с приведенным ниже кодом, и он хорошо работает для моего UUID, но для работы NSInteger мне нужно отправить «0010» вместо 16 и «0001» вместо 1. Итак, любая подсказка о том, как сделать это преобразование.

- (NSData *)hexData {
    NSMutableData *hexData = [NSMutableData data];
    int idx = 0;

    for (idx = 0; idx+2 <= self.length; idx+=2) {
        NSRange range = NSMakeRange(idx, 2);
        NSString* hexStr = [self substringWithRange:range];
        NSScanner* scanner = [NSScanner scannerWithString:hexStr];
        unsigned int intValue;
        [scanner scanHexInt:&intValue];
        [hexData appendBytes:&intValue length:1];
    }

    return hexData;
}

РЕДАКТИРОВАТЬ:

int8_t test = -59;
int8_t bytes = CFSwapInt16HostToBig(test);
NSData *data1 = [NSData dataWithBytes:&bytes length:sizeof(bytes)];

Достижение как 0xFF вместо 0xC4


person Abhinav    schedule 20.12.2013    source источник
comment
Посмотрите мой ответ на мой собственный пост здесь: stackoverflow.com/a/32951887/1758944   -  person Malek Belkahla    schedule 05.10.2015
comment
Посмотрите мой ответ на аналогичный пост здесь: stackoverflow.com/a/32951887/1758944   -  person Malek Belkahla    schedule 05.10.2015


Ответы (1)


Поскольку ваша строка является строкой UUID, вы можете сделать что-то вроде этого:

NSString *test = @"";
uuid_t uuid;
uuid_parse([test UTF8String], uuid)
NSData *data = [NSData dataWithBytes:uuid length:16];

Для номера вы можете сделать:

NSInteger test = 1;
NSData *data = [NSData dataWithBytes:&test length:sizeof(test)];

Имейте в виду, что NSInteger, вероятно, больше двух байтов, и вам также может потребоваться позаботиться о порядке байтов.

Обновление: поскольку кажется, что вам нужно, чтобы целочисленное значение составляло два байта, вы должны сделать:

uint16_t test = 1;
NSData *data = [NSData dataWithBytes:&test length:sizeof(test)];

Это обеспечит 2 байта. Вам также нужно беспокоиться о порядке байтов, поэтому вам действительно нужно:

uint16_t test = 1;
uint16_t bytes = CFSwapInt16HostToBig(test);
NSData *data = [NSData dataWithBytes:&bytes length:sizeof(bytes)];

При необходимости измените CFSwapInt16HostToBig на CFSwapInt16HostToLitte.

person rmaddy    schedule 20.12.2013
comment
Спасибо! UUID работает нормально. Голосую за это. Я уже пробовал целочисленный подход, упомянутый но он не работает для меня. Я должен создать поток байтов, как я уже упоминал, и только тогда он работает. Любая идея о том, как создать такой поток байтов. - person Abhinav; 20.12.2013
comment
На самом деле, я имею дело с оборудованием, которое принимает HEX-представление строк. Итак, чтобы отправить 16, мне нужно отправить массив 0x00 и 0x10 байт. С вашим решением он обрабатывает этот поток байтов как другое значение. Пожалуйста, смотрите мой обновленный вопрос. - person Abhinav; 20.12.2013
comment
Потрясающий!!! Это работало для положительных целых чисел. Не могли бы вы подсказать, как это сделать для целых чисел со знаком? - person Abhinav; 21.12.2013
comment
Это будет работать и для целых чисел со знаком. Просто присвойте отрицательное значение test. - person rmaddy; 21.12.2013
comment
Я пытался, и это не сработало. Тип данных это беззнаковое целое uint16_t. - person Abhinav; 21.12.2013
comment
Определить не получилось. Пожалуйста, перестаньте так расплывчато говорить о проблемах, которые у вас возникли. Что на самом деле происходит, когда вы пытаетесь использовать отрицательное число? - person rmaddy; 21.12.2013
comment
Прежде всего, мои извинения за то, что я не упомянул проблему, с которой я столкнулся с отрицательными значениями. Когда я попытался отправить -59, он достиг адресата как 0xFF Hex вместо 0xC4. Смотрите мой отредактированный вопрос. Я изменил uint16_t на int8_t. Также пробовал с int16_t. - person Abhinav; 21.12.2013
comment
Вы int16_t за два байта. int8_t только для одного байта. - person rmaddy; 21.12.2013