【发布时间】:2014-11-29 07:00:54
【问题描述】:
我在解码 Base64 字符串时遇到问题。以下是相关代码(在类别文件中):
- (NSString *)base64DecodedString {
NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:self options:0];
NSString *decodedString = [[NSString alloc] initWithData:decodedData encoding:NSASCIIStringEncoding];
NSLog(@"Encoded String: %@\n"
"Decoded String: %@\n"
"Reencoded Check: %@\n", self, decodedString, [decodedString base64EncodedString]);
return decodedString;
}
- (NSString*)base64EncodedString {
NSData *encodedData = [self dataUsingEncoding:NSASCIIStringEncoding];
NSString *encodedString = [encodedData base64EncodedStringWithOptions:0];
return encodedString;
}
使用NSASCIIStringEncoding,当调用base64DecodedString分类方法时,得到如下输出:
Encoded String: XMEBbbUGO4wuZ8Eljx6x8Q==
Decoded String: \Ámµ;.gÁ%±ñ
Reencoded Check: (null)
Encoded String: NBbA3SzI5j8ioOTeQC5WxNvEFNg0WFy4nRjmCSdypCI=
Decoded String: 4ÀÝ,Èæ?" äÞ@.VÄÛÄØ4X\¸æ 'r¤"
Reencoded Check: (null)
使用上面相同的代码,但使用NSUTF8StringEncoding,我得到以下输出:
Encoded String: oP6u7jErDp4KHzC6WmzHEw==
Decoded String: (null)
Reencoded Check: (null)
Encoded String: qjne07HA4PFIFrwTP9E/ejK6XtWoFtbgdDTpL8wmfgY=
Decoded String: (null)
Reencoded Check: (null)
关于发生了什么的任何想法?无论哪种情况,解码后的字符串都不正确,重新编码检查不会产生原始字符串。
【问题讨论】:
-
您期望“解码的字符串”是什么?编码字符串中的数据似乎不是文本;它不能表示为 ASCII(或 UTF8)字符串。
-
@duskwuff 我用它作为解密另一个文件的密钥。我不确定密钥 supposed 是什么,但使用上述结果作为密钥不会产生有效文件。我已经使用具有相同功能的已知密钥成功解密了另一个文件,因此我假设生成密钥的方式不正确。另一种可能是文件的加密方式发生了变化。
-
@duskwuff,无论如何,鉴于 Base64 编码的输入,我想知道您将如何正确解码它?
-
您是否尝试过其他一些选项: Data =[[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters]; str = [Data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
-
@Mike.R 我试过了(gist.github.com/nmock/37d500749a11eb1c2fa1),但使用它作为密钥仍然存在问题。有什么方法可以使重新编码产生原始结果?
标签: ios objective-c base64