【问题标题】:nsstring to unsigned char []nsstring 到 unsigned char []
【发布时间】:2015-01-31 02:33:29
【问题描述】:

我会转换

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

有什么帮助吗?

编辑

从 Jan Baptiste Younè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);

真的不错! 但是我可以接受两个答案吗?

【问题讨论】:

    标签: objective-c c


    【解决方案1】:

    这不仅仅是一个简单的转换,您需要实际解析字符串中的值。您可以使用 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;
    

    而不是将值放入无符号字符数组中。为此,resulti 都应初始化为零。

    【讨论】:

    • 好吧,我找到了方法,用一种更简单的方式......我应该把新代码归功于谁?
    【解决方案2】:

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

    【讨论】:

    • 喜欢 *myString = @"101c3700" 然后呢? :)
    • 不使用scannerWithStringscanUpToString:@" " intoString:aNumberString构造扫描器,然后用另一个扫描器和scanNexInt:@myIntaNumberString变量转换为int
    • 感谢您回答我。我从你的建议和斯文的回答中找到了做我需要的方法......
    • 您也可以使用sscanf从使用getCString:方法提取的数据中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多