【问题标题】:Base 64 encoding / decodingBase 64 编码/解码
【发布时间】: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


【解决方案1】:

我建议您尝试使用更多NSUTF8StringEncoding。例如:

- (NSString *)base64DecodedString {
NSString *tempString = @"Here you come";
NSData *data = [tempString dataUsingEncoding:NSUTF8StringEncoding];
NSString *decodedData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

NSLog(@"Simple String: %@\n"
      "Decoded String: %@\n"
      , tempString, decodedData);
return nil;

}

在您的情况下,[[NSData alloc] initWithBase64EncodedString:self options:0]; 返回 nil。(当我尝试时)。 简单的例子: iOS 7: Base64 Encode and Decode NSData and NSString Objects

希望我能帮上忙。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2011-04-03
    • 2011-10-11
    • 2018-11-17
    相关资源
    最近更新 更多