nsstring到unsigned char []

时间:2014-12-02 18:21:34

标签: objective-c c

我会转换

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

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

我的目标是获取它们,然后使用以下代码进行交换:

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

输出应为:

log = 00371c10

任何帮助?

修改

JanBaptisteYounès和Sven都找到了理解我的问题并用这段代码解决的方法:

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);

真的没问题! 但我可以接受两个答案吗?

2 个答案:

答案 0 :(得分: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;
}

当然这个示例缺少错误处理(单个值无法放入unsigned char或者可能超过四个)。

但这只解决了你问题的一半。另一个问题是将其转换为int。您通过将unsigned char指针转换为int指针来完成此操作。这不是可移植的,在C中也不合法。要总是得到你想要的结果,你应该使用位移来组装你的int。所以在你的循环中你可以做到

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

而不是将值放在unsigned char数组中。对于此resulti,都应该初始化为零。

答案 1 :(得分:1)

您可以在空格处剪切原始字符串,并使用此处给出的解决方案Objective-C parse hex string to integer。您还可以使用scanUpToString:intoString来解析空间字符。