Objective-C中的URL Safe Base64

时间:2012-06-19 17:41:34

标签: python objective-c base64 zlib

我已经看过很多关于如何在Objective C中解码Base64编码字符串的Stack Overflow帖子,但我仍然遇到问题。

基本上,我正在尝试将Python脚本移植到Objective C. Python代码行是:

zlib.decompress(base64.urlsafe_b64decode(string))

当我通过Python版本的base64.urlsafe_b64decode运行“string”时,它结果正确,然后可以正确地进行Zlib解压缩。当我通过Objective C Base64解码器的任何变体运行“string”时,它有点工作,但结果不一样,Zlib解压缩失败。

URL安全Base 64解码与SO上广泛使用的代码之间有区别吗?如果有人之前遇到过这样的困难,那么对于该怎么做的任何见解都会受到赞赏。

谢谢,SO!

编辑1:我使用找到的{64}代码here。可以找到原始数据(仍然是Base64编码的)here,可以找到生成的Objective-C here,并且可以找到生成的Python here。理想情况下,我希望Objective C代码解码为与Python脚本相同的文本。

2 个答案:

答案 0 :(得分:13)

特别感谢格雷厄姆指出RFC差异,我能够解决问题。如果将来有人遇到这个,这里有解决方法:

  1. here下载NSData + Base64代码。
  2. NSData+Base64.m中,您需要将查找表更改为以下内容:
  3. //
    // Mapping from 6 bit pattern to ASCII character.
    //
    static unsigned char base64EncodeLookup[65] =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
    
    //
    // Definition for "masked-out" areas of the base64DecodeLookup mapping
    //
    #define xx 65
    
    //
    // Mapping from ASCII character to 6 bit pattern.
    //
    static unsigned char base64DecodeLookup[256] =
    {
        xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
        xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
        xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 62, xx, xx, 
        52, 53, 54, 55, 56, 57, 58, 59, 60, 61, xx, xx, xx, xx, xx, xx, 
        xx,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 
        15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, xx, xx, xx, xx, 63, 
        xx, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 
        41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, xx, xx, xx, xx, xx, 
        xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
        xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
        xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
        xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
        xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
        xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
        xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
        xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    };
    

    这将使Objective C的解码等同于Python的。

答案 1 :(得分:8)

iOS 7.0及更高版本的方法有" base64EncodedStringWithOptions"在NSData上将执行上述查找。但是此方法不返回URL安全编码字符串。因此,必须手动执行替换以获取URL安全编码的字符串。见下文..

NSData *originalData = [originalString dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64String = [originalData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
base64String = [base64String stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
base64String = [base64String stringByReplacingOccurrencesOfString:@"+" withString:@"-"];

结果base64String现在是URL安全的。