【问题标题】:URL Safe Base64 in Objective-CObjective-C 中的 URL 安全 Base64
【发布时间】:2012-06-21 19:30:12
【问题描述】:

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

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

zlib.decompress(base64.urlsafe_b64decode(string))

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

URL 安全的 Base 64 解码和 SO 上广泛可用的代码之间有区别吗?如果有人以前遇到过这样的困难,我们将不胜感激。

谢谢!

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

【问题讨论】:

  • 如果您发布您的代码、您在目标 c 中使用的库以及给定类似输入字符串时 python 和目标 c 例程的结果,这可能会有所帮助
  • string使用的是什么编码方式? ASCII? UTF-8?还有什么?
  • @orzechowskid string 应该是 UTF-8 编码的。 @Harold 我会立即用你的答案编辑问题本身。
  • “原始数据(仍然是 Base64 编码的)可以在这里找到”这是 RFC4648 base64url 编码,ObjC 编码器无法处理。它只接受“香草”base64。
  • @GrahamLee 我实际上调整了编码以匹配,但我仍然需要修复解码。你知道 RFC4648 的任何 ObjC 解码器吗?

标签: python objective-c base64 zlib


【解决方案1】:

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

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

生成的 base64String 现在是 URL 安全的。

【讨论】:

  • 这是一个不错的解决方案,因为您不需要引入任何依赖项!
【解决方案2】:

特别感谢 Graham 指出 RFC 的不同之处,我得以解决问题。如果以后有人遇到此问题,请按以下方法解决:

  1. here下载NSData+Base64代码。
  2. NSData+Base64.m 中,您需要将查找表更改为以下内容:
//
// 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。

【讨论】:

  • 好东西——你刚刚摆脱了我的头痛
  • 对我来说效果很好!
  • @KrupalGhorpade 这个问题很老了,它早于 iOS 7,它内置了这个功能。我已将接受的答案更改为现在正确的答案。感谢您指出这一点!
猜你喜欢
  • 2018-06-05
  • 2014-12-08
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多