我一直在尝试将用户默认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
为什么世界上这样做呢?我想要原始的十六进制值,而不是我的十六进制值的解释。
答案 0 :(得分:1)
一个字节既不是十六进制也不是ascii,也不是八进制,也不是int或float等,它们只是显示和/或考虑一个字节的不同方式。 NSLog
显示对象的方式取决于对象的description
方法的编写方式。因此NSLog
NSData
和NSString
的{{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];
如果仍然没有解决您的问题,请告诉我.. :)