在不更改数据的情况下将NSString转换为NSData

时间:2011-10-17 23:25:33

标签: iphone objective-c ios nsstring nsdata

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

  

6173736e 616d65a2 15165570 6f696e74 584e534f 626a6563

但是,我需要在NSData对象中使用这些完全相同的数据。我尝试过这样的事情:

  

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

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

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

3 个答案:

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

(警告:用浏览器编写,未测试过,如果你试图用它运行核反应堆,可能会导致熔化等)。

答案 1 :(得分:0)

以第一个字符6为例。

6字符的十六进制值(根据this link为0x360d0a,milage可能因编码而异)与十六进制值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;
}

答案 2 :(得分:0)

我认识的派对来晚了,但我最近遇到了类似的问题,从詹姆斯·韦伯斯特的回答开始,到此为止:

-(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;
}