NSString到NSData转换为十六进制值

时间:2014-01-31 14:03:09

标签: objective-c nsstring nsdata

我一直在尝试将用户默认NSString(也尝试过NSData)转换为我可以与char数组一起使用的十六进制值。问题是,每次我从NSString或NSData转换它时,它采用十六进制值并将它们转换为ASCII值,这根本不是我想要的。我怎么告诉它从字面上取出那里的值并保持它们的十六进制?我很难找到解决方案。

在我的.plist中

<key>shit</key>
<string>5448495344414e475448494e474e45454453544f53544159484558</string>

我的代码将NSString转换为NSData

  NSString *defaults = [[NSUserDefaults standardUserDefaults] objectForKey:@"shit"];
    NSData *theData = [defaults dataUsingEncoding:NSUTF8StringEncoding];
    NSUInteger dataLength = [theData length];
    Byte *byteData = (Byte*)malloc(dataLength);
    memcpy(byteData, [theData bytes], len);

NSLog(@"THIS : %@",[NSData dataWithBytes:byteData length:len]);

输出:

THIS : <35343438 34393533 34343431 34653437 35343438 34393465 34373465 34353435 34343533 35343466 35333534 34>len

为什么世界上这样做呢?我想要原始的十六进制值,而不是我的十六进制值的解释。

2 个答案:

答案 0 :(得分:1)

一个字节既不是十六进制也不是ascii,也不是八进制,也不是int或float等,它们只是显示和/或考虑一个字节的不同方式。 NSLog显示对象的方式取决于对象的description方法的编写方式。因此NSLog NSDataNSString的{​​{1}}显示相同的字节。

如果要访问NSData中的字节,只需直接访问它们:theData.bytes , no need to memcpy`。

最后也是最重要的一点:你想要完成什么?

通过获得一本关于“C”语言的好书并研究它,新开发人员得到了很好的服务 - 这就是我所做的。

答案 1 :(得分:0)

这是我用来从字符串中获取Hex数据的方法:

-(NSData *) HexByteDataFromString:(NSString *) str
{
    NSMutableData *data= [[NSMutableData alloc]init];
    unsigned char whole_byte;
    char byte_chars[3] = {'\0','\0','\0'};
    for (int i = 0; i < ([str length] / 2); i++)
    {
        byte_chars[0] = [str characterAtIndex:i*2];
        byte_chars[1] = [str characterAtIndex:i*2+1];
        whole_byte = strtol(byte_chars, NULL, 16);
        [data appendBytes:&whole_byte length:1];
    }
    return data;
}

现在要在NSData中打印数据,只需使用此

NSLog(@"%@",[myData description]);

这里,描述将准确给出您想要的十六进制值。 :)

<强>更新

使用Byte *dataBytes = (Byte *)[myData bytes]; 这将为您提供所需的一切。您可以引用特定字节,就像从字节数组中引用它们一样。

像这样:

char x=  dataBytes[2];

如果仍然没有解决您的问题,请告诉我.. :)