如何将 NSString 转换为 NSData?并且数据与字符串内容相同

Posted

技术标签:

【中文标题】如何将 NSString 转换为 NSData?并且数据与字符串内容相同【英文标题】:how can I translate a NSString to NSData? And the data has the same content as the string 【发布时间】:2011-01-26 06:54:09 【问题描述】:
NSString * theString=@"e88d";
NSData * data;

// something I should implement

NSLog(@"%@", theString);

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

我希望两次打印的结果相同。


AES加解密:

(1).服务器:

如果明文是@"abcd";

AES 加密的data(NSData data type)"d882830c dc892036 4345839f 13c7516a"

(2).在我的本地应用程序中,我的代码是:

NSData*data=[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://..."]]; 
NSString * mystring= [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

但是,要成功解密数据,我必须有一个等于"d882830c dc892036 4345839f 13c7516a"data(NSData date type)。但等于正确值的是 mystring(NSString data type) 而不是 data(NSData data type)

加密和解密函数都需要data(NSData data type)作为输入数据。

- (NSData*)AES128EncryptWithKey:(NSString*)key;
- (NSData*)AES128DecryptWithKey:(NSString*)key;

【问题讨论】:

你的意思是要将字符串@"e88d"转换成2字节的数据0xe8,0x8d? 我的意思是,如果我尝试 NSLog(@"%@",data); gdb 将显示:“e88d” 你想要达到什么目的?我的意思是你打算用 NSData 对象做什么?或许我们可以提供更清晰的答案。 NSString * theString=@"abcd"; NSData * 数据; // 代码 NSLog(@"%@", theString); NSLog(@"%@",[数据描述]);我希望两次打印的结果是一样的。 @someone:除非你想打破很多惯例,否则这是不可能的。 NSData 的描述总是采用<12345678 abcdef01 99> 的形式 【参考方案1】:

我想这可能会回答你的问题

How do I convert a NSString value to NSData?

【讨论】:

嗯,打印出来的数据和字符串不一样。 可能是因为您在 NSLog(@"%@",data); 中使用的 %@ 需要一个 NSString 对象,所以您传递的是一个 NSData 对象。 如果我使用NSLog(@"%@",[数据描述]),希望gdb显示:e88d。如何获取数据? AES加解密:服务器:如果明文为:@"abcd"; AES 加密数据(NSData 数据类型)在我的本地应用程序中是:“d882830c dc892036 4345839f 13c7516a”,我的代码是:NSData*data=[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://..."]] ; NSString * mystring= [[NSString alloc] initWithData:数据编码:NSUTF8StringEncoding];但是,要解密 AES 加密字符串,我必须得到一个等于“d882830c dc892036 4345839f 13c7516a”的数据(NSData 日期类型)。但它是 mystring(NSString 数据类型)而不是数据(NSData 数据类型)等于正确的值。【参考方案2】:

您要设置的描述不是特定于实例的值。这是类/对象的描述。 NSData 将有类似的描述:“这是一个数据对象”。你可以通过重写方法来重写这个值。


- (NSString *)description 
    return @"e88d"; //normally used for class description

当然,您必须为此继承 NSData 对象,然后像上面的代码一样覆盖描述。

附言。我认为您不想为此使用 description 来解释它在每个类中的用途。


你可能想要的是:


NSString * theString=@"e88d";
NSData * data=[theString dataUsingEncoding:NSUTF8StringEncoding];

NSLog(@"%@", theString);
NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

【讨论】:

【参考方案3】:
@interface NSString (Joke)
- (NSString *)description;
@end
@implementation NSString (Joke)
- (NSString *)description

    return @"Panda!";

@end

@interface NSData (Joke)
- (NSString *)description;
@end
@implementation NSData (Joke)
- (NSString *)description

    return @"Panda!";

@end

【讨论】:

过于复杂,更简单更通用的解决方案:#define NSLog(...) NSLog(@"Panda!")【参考方案4】:

这个怎么样

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://..."]];
NSData *decryptedData = [data AES128DecryptWithKey:key];
NSString *mystring = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];

【讨论】:

以上是关于如何将 NSString 转换为 NSData?并且数据与字符串内容相同的主要内容,如果未能解决你的问题,请参考以下文章

如何将NSString值转换为NSData?

如何以编程方式将 NSData 转换为 NSString? [复制]

如何将设备令牌(NSData)转换为NSString?

如何将 NSString 转换为 NSData?并且数据与字符串内容相同

将 UTF-8 编码的 NSData 转换为 NSString

将UTF-8编码的NSData转换为NSString