2014-12-02 2 views
0

Я бы конвертироватьNSString к неподписанные символ []

NSString *myString = @"0x10 0x1c 0x37 0x00"; //Aquired reading text file using NSString methods.. 

в

unsigned char convertedfrommyString[] = { 0x10, 0x1c, 0x37, 0x00 }; 

Моя цель состоит в том, чтобы aquiring их, а затем поменять его, используя этот код:

unsigned char convertedfrommyString[] = { 0x10, 0x1c, 0x37, 0x00 }; 
    int data = *((int *) convertedfromString); 
    NSLog(@"log = %08x", data); 

значение выходной должно быть:

log = 00371c10 

Любая помощь?

EDIT

С обеих Ян Батист Юнес и Свена я нашел способ, чтобы понять мою проблему и решить с помощью этого кода:

NSString *myString = [[@"0x10 0x1c 0x37 0x00" stringByReplacingOccurrencesOfString:@"0x" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    unsigned result = 0; 
    NSScanner *scanner = [NSScanner scannerWithString:myString]; 
    [scanner scanHexInt:&result]; 
    int reverse = NSSwapInt(result); 
    NSLog(@"scanner: %8u", result); 
    NSLog(@"bytes:%08x", result); 
    NSLog(@"reverse:%08x (that is what i need!)", reverse); 

Действительно OK! Но могу ли я принять два ответа?

ответ

1

Вы можете вырезать исходную строку в пространстве и использовать решение, приведенное здесь Objective-C parse hex string to integer. Вы также можете использовать scanUpToString:intoString для разбора до пробелов.

+0

как * myString = @ "101c3700", а затем что? :) – Mike97

+0

Не создавайте сканер с помощью 'scannerWithString',' scanUpToString: @ "" inString: aNumberString', а затем конвертируйте переменную 'aNumberString' в int с другим сканером и' scanNexInt: @ myInt' –

+0

Спасибо, что ответили на меня. Я нашел способ сделать то, что мне нужно от вашего предложения, но также и от Sven answer ... – Mike97

2

Это больше, чем простое преобразование, вам необходимо проанализировать значения из вашей строки. Вы можете использовать NSScanner для этого.

NSScanner *scanner = [NSScanner scannerWithString: @"0x10 0x1c 0x37 0x00"]; 
unsigned char convertedfrommyString[4]; 
unsigned index = 0; 
while (![scanner isAtEnd]) { 
    unsigned value = 0; 
    if (![scanner scanHexInt: &value]) { 
     // invalid value 
     break; 
    } 

    convertedfrommyString[index++] = value; 
} 

Конечно, этот пример отсутствует обработку ошибок (отдельные значения не может поместиться в неподписанные символ или не может быть больше четырех).

Но это решило только половину вашей проблемы. Другая проблема заключается в преобразовании этого в int. Вы сделали это, выставив неподписанный указатель на указатель на int. Это не переносимо, а также не является законным в C. Чтобы всегда получать результат, который вы хотите, вместо этого вы должны использовать бит-сдвиги для сборки вашего int. Поэтому внутри вашей петли вы можете сделать

result = result | (value << i); 
i += 8; 

вместо того, чтобы помещать значения внутри массива без знака. Для этого result и i оба должны быть инициализированы до нуля.

+0

Хорошо, я нашел путь более простым способом ... кому я должен отдать должное новому коду? – Mike97

Смежные вопросы