我有一个包含一系列十六进制值的NSString,例如:
6173736e 616d65a2 15165570 6f696e74 584e534f 626a6563
但是,我需要在NSData对象中使用这些完全相同的数据。我尝试过这样的事情:
mydata = [mystring dataUsingEncoding:NSASCIIStringEncoding]; //尝试了各种编码选项
不管我做了什么,mydata
永远不会包含NSString所具有的相同值,这就是我所需要的。
非常感谢任何帮助!谢谢。
答案 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;
}