使用Base64编码字符串初始化,返回nil。

7
我的resultString是'PHNhbWxwOlJlc3BvbnNlIH...c3BvbnNlPgoK',但解码后decodedData为nil。
NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:resultString options:0];
我还尝试了https://www.base64decode.org/ 上的该字符串,结果能够成功显示。
解码出错在哪里呢?

1
你有没有在 Stack Overflow 上尝试搜索?希望这个链接能帮到你: https://dev59.com/o2Ik5IYBdhLWcg3wp_mM - Raj Tandel
是的,我先尝试搜索了一下,然后再发布。 - Krish Solanki
3个回答

10

可能您的字符串中有一些无效字符,例如填充新行。尝试使用NSDataBase64DecodingIgnoreUnknownCharacters选项代替0

NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:resultString options:NSDataBase64DecodingIgnoreUnknownCharacters];

1
我遇到了<OS_dispatch_data: data[0x1c04610c0] = { leaf, size = 442, buf = 0x105829a00 }>的问题。然后我将我的API数据从字符串转换为数据,并使用上述代码重新转换为数据(以进行进一步的解密)。在使用上述代码时,传递0会得到nil。传递NSDataBase64DecodingIgnoreUnknownCharacters可以解决该问题。 - Imran

3
几乎可以确定你的字符串不是有效的Base64,但它足够“接近”,以至于base64decode.org接受它。最有可能的原因是你省略了一个尾随的=。base64decode.org容忍这种情况,并且会悄悄地丢弃它无法解码的内容(在这种情况下是最后一个字节)。NSData不容忍这种情况,因为它不是有效的Base64。
base64decode.org也容忍字符串中的随机非Base64字符,并将它们丢弃。NSData不容忍这种情况(同样因为它无效)。

真的。NSData将非填充的base64字符串视为“无效的Base-64”。如果有需要,可以参考https://dev59.com/amEi5IYBdhLWcg3wUK2C#21407393添加填充。 - Wei WANG

-1

试试这个!简单易行的解决方案 :) 必须使用 Foundation.framework。默认情况下,当输入不被识别为有效的 Base-64 时,initWithBase64EncodedString 方法会返回 nil。请检查您的字符串是否是有效的 Base-64 类型!

    NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:@"eyJuYW1lIjoidmlnbmVzaCJ9" options:0];
    NSError *dataError;
    NSDictionary* responseObject = [NSJSONSerialization JSONObjectWithData:decodedData
                                                 options:kNilOptions
                                                   error:&dataError];
   if(dataError == nil) {
        NSLog(@"Result %@",responseObject);
   }

你是否已经将Foundation框架添加到你的项目中了?结果 { 名称 = vignesh; } - Vignesh Kumar
@KrishSolanki,请提供编码字符串示例。 - Vignesh Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接