【问题标题】:Base 64 decoding produces emptyBase 64 解码产生空
【发布时间】:2017-05-31 01:38:49
【问题描述】:

我使用以下代码将base64字符串转换为普通字符串。

   NSError *localError = nil;
    NSString *myString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:myString options:0];
    NSString *decodedString = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding];
    NSLog(@"encoded string , %@",myString);
    NSLog(@"Decode String Value: %@", decodedString);

编码字符串打印 base64 字符串,但解码字符串为空。为什么会这样?

【问题讨论】:

    标签: ios objective-c base64


    【解决方案1】:

    避免在解码前转换为字符串:

    NSData *decodedData = [[NSData alloc] initWithBase64EncodedData:data options:NSDataBase64DecodingIgnoreUnknownCharacters];
    NSString *decodedString = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding];
    

    Base64 的一些实现每 64 个字符添加换行符。您应该能够通过使用此选项来解决此问题:NSDataBase64DecodingIgnoreUnknownCharacters

    【讨论】:

    • 输出仍然为空
    • base64 编码的内容来自哪里?你确定它有效吗?
    • 我认为 Base64 的一些实现每 64 个字符添加换行符。您应该能够通过使用此选项来解决此问题:NSDataBase64DecodingIgnoreUnknownCharacters。我还看到一些实现无法使用= 字符填充到4 个字符的倍数。有关更多信息,请参阅此答案:stackoverflow.com/questions/21406482/…
    • 即时接收 “WwogICJVc2VyTG9naW5SZXNwb25zZVN1Y2Nlc3MiLCAKICB7CiAgICAic2Vzc2lvbl90b2tlbiI6ICIxNDY3YTAxMWRlZmI0MmEyODBiNWIyZWQ0NmRhYzFiYSIsIAogICAgInVzZXJfaWQiOiA4LCAKICAgICJlbXBsb3llZV9uYW1lIjogImtub3cgbWFuYWdlciIKICB9Cl0 =”跨度>
    • 很高兴它有帮助,我已经用帮助你的一点更新了答案:)
    【解决方案2】:

    如果您想对数据进行编码和解码,则可以使用此代码。

        // Create NSData object
        NSData *data1 =[@"My String" dataUsingEncoding:NSUTF8StringEncoding];
    
        // Encoded NSString from NSData
        NSString *base64Encoded = [data1 base64EncodedStringWithOptions:0];
        NSLog(@"%@",base64Encoded);
    
        // Encoding data
        NSData *base64Data = [data1 base64EncodedDataWithOptions:0];
        NSLog(@"%@",base64Data);
    
        // Decoding data
        NSData *nsdataDecoded = [base64Data initWithBase64EncodedData:base64Data options:0];
        NSString *str = [[NSString alloc] initWithData:nsdataDecoded encoding:NSUTF8StringEncoding];
        NSLog(@"%@", str);
    

    【讨论】:

    • 它打印相同的 base64 字符串
    • 来自服务器的响应已经是一个base64字符串所以我使用如下` NSData *nsdataDecoded = [data initWithBase64EncodedData:data options:0]; NSString *str = [[NSString alloc] initWithData:nsdataDecoded encoding:NSUTF8StringEncoding];`
    • 但输出为空字符串
    • 请验证您从服务器接收到的 base64 是否正确。
    • 林接收 “WwogICJVc2VyTG9naW5SZXNwb25zZVN1Y2Nlc3MiLCAKICB7CiAgICAic2Vzc2lvbl90b2tlbiI6ICIxNDY3YTAxMWRlZmI0MmEyODBiNWIyZWQ0NmRhYzFiYSIsIAogICAgInVzZXJfaWQiOiA4LCAKICAgICJlbXBsb3llZV9uYW1lIjogImtub3cgbWFuYWdlciIKICB9Cl0 =”跨度>
    【解决方案3】:

    您可以使用 Base64 库进行编码或解码,

    https://github.com/dasdom/hAppy/tree/master/base64

    那你就可以使用这段代码了,

    NSString *strEncoded = [Base64 编码:数据];

    【讨论】:

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