【问题标题】:Converting NSString to NSData without changing data在不更改数据的情况下将 NSString 转换为 NSData
【发布时间】:2011-10-17 23:25:33
【问题描述】:

我有一个包含一系列十六进制值的 NSString,例如:

6173736e 616d65a2 15165570 6f696e74 584e534f 626a6563

但是,我需要将完全相同的数据放在 NSData 对象中。我尝试过做以下事情:

mydata = [mystring dataUsingEncoding:NSASCIIStringEncoding]; //已经尝试了各种编码选项

不管我做什么,mydata 永远不会包含与 NSString 相同的值,这正是我所需要的。

非常感谢任何帮助!谢谢。

【问题讨论】:

    标签: iphone objective-c ios nsstring nsdata


    【解决方案1】:

    您似乎误解了该方法的作用。它不会将字符串解析为数字的十六进制表示;它只是创建一个数据对象,该对象表示具有特定字节编码的字符串。因此,在您的情况下,数据将包含值为 54(“6”的 ASCII 值)、49(“1”)、55(“7”)、51(“3”)、55( '7'),51('3'),54('6'),101('e')等等。

    如果要解析十六进制字符串,可以使用 NSScanner 扫描十六进制值。

    这是你想要的基本形式:

    NSScanner *scanner = [NSScanner scannerWithString:yourHexString];
    NSMutableData *data = [NSMutableData data];
    while (![scanner isAtEnd]) {
        unsigned value;
        if ([scanner scanHexInt:&value]) {
            [data appendBytes:&value length:sizeof(value)];
        } else {
            NSLog(@"Invalid value in scanned string");
        }
    }
    

    (警告:写在浏览器中,尚未测试,如果您尝试使用它运行核反应堆可能会导致崩溃等)

    【讨论】:

    • 我明白了。因此,如果我不想解析它,而只想创建一个与 String 对象具有完全相同值的数据对象,那么最好的方法是什么?
    • @none:就像我说的,NSScanner。您必须解析它,因为字符串不包含 values — 它只是一个字符串。 将其理解为十六进制值,因为您的大脑正在将其解析为您。你需要告诉计算机做同样的事情,NSScanner 就是这样做的。
    • 感谢您的回复。您能否指出我正确的方向?之前没有使用过 NSScanner。
    • 谢谢。不幸的是,我试了一下,每个字符都显示“扫描字符串中的值无效”
    【解决方案2】:

    以第一个字符6为例。

    6 字符的十六进制值(0x360d0a 根据this link,里程可能因编码而异)与十六进制值 0x6 不同。

    0x360d0a != 0x6
    

    您已经拥有的似乎是数据,但我不确定您如何才能再次准确地写入该数据。

    你可能不得不求助于:

    -(NSData*) dataFromString:(NSString*) s
    {
        NSMutableData *d = [[NSMutableData alloc] init] autorelease];
        for (int i = 0; i < [s length]; i++)
        { 
             char c = [s characterAtIndex:i];
             switch (c)
             {
                 case '0': [d appendData:/*Add data to represent 0*/]; break;
                 case '1': [d appendData:/*Is this append as simple as append:0x1*/]; break;
                 ...
                 case 'F': [d appendData:/*Add data to represent F*/]; break;
                 //All 16 cases
             }
        }
        return d;
    }
    

    【讨论】:

    • 感谢您的回复。该字符串确实最初来自 NSData 对象。它现在是一个 NSString ;我想将其转换回 NSData。我该怎么做呢?
    • “直接保存为 NSData”是什么意思?你认为他实际上有一个 NSData 对象,他错误地认为它是一个 NSString?
    • 我不确定我的意思!但是请看一下代码示例,我希望不会,但是您可能不得不求助于这样的东西。
    • 嗯,对不起,我在这里过得很艰难。 /*Add data to represent 0*/ 区域会发生什么?
    • 我认为这只是0x0。虽然没有测试过
    【解决方案3】:

    我知道的聚会迟到了,但我最近遇到了类似的问题,从 James Webster 的回答开始,然后得出了这个结论:

    -(NSData*) dataFromString:(NSString*) s
    {
        NSMutableData *d = [[NSMutableData alloc] init];
        for (int i = 0; i < [s length]; i++)
        {
            char c = [s characterAtIndex:i];
            [d appendBytes:&c length:1];
        }
        return d;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 2010-12-21
      相关资源
      最近更新 更多