【问题标题】:iOS base64 encoding bug?iOS base64 编码错误?
【发布时间】:2015-01-13 05:33:57
【问题描述】:

我想对一个 NSString 进行 base64 编码。却得到了错误的结果。是iOS base64编码的bug吗? characters[] 中的 int 数字是字符的 ASCII 码。

int characters[] = {119,38,149,28,73,136,86,199,8,225,36,222,129,63,27,102,41,227,39,113,90, 
             92,150,117,130,106,134,255,182,11,0,198,110,41,175,208,158,57,211,197}; 
 int i = 0; 
 NSString *result = [[NSString alloc] init]; 
 while ( i < 40) { 

     NSString *tempString = [NSString stringWithFormat:@"%c", characters[i]]; 
     result = [result stringByAppendingString:tempString]; 
     i++; 
 } 

 NSData *tempData = [result dataUsingEncoding:NSISOLatin1StringEncoding]; 
 NSString *b64String = [tempData base64EncodedStringWithOptions:0]; 
 NSLog(@"%@",b64String); 

通过上面的代码,我得到了 b64String 的结果:

dyaVHEmIVscI4STegT8bZinjJ3FaXJZ1gmqG/7YLxm4pr9CeOdPF

但正确答案应该是:

dyaVHEmIVscI4STegT8bZinjJ3FaXJZ1gmqG/7YLAMZuKa/QnjnTxQ==

有人可以帮我得到正确的答案吗?

【问题讨论】:

  • 我怀疑数组中的值 0 是问题所在。 0 通常用作字符串结束字符,并且在您的 for 循环中可能没有正确格式化(甚至可能被跳过)。我很想用 1 而不是 0 再次测试它。
  • 用Python中类似的代码,我可以得到正确答案。我想知道如何让它在 iOS 中工作。因为在我的程序中,我需要对字符串进行 base64 编码,我的代码 99% 都可以工作。有 1% 的机会,它会输出错误的答案。
  • 要解决它,我们必须先找到问题。请通过将 0 替换为其他内容来进行测试。如果这样你在 Python 和你的代码中得到相同的结果,那么我们就会知道我们必须修复什么。

标签: ios objective-c base64 encode


【解决方案1】:

问题在于数组中的值0。值 0 被转换为字符 0,它是用于字符串终止的特殊字符 (null)。显然 iOS Objective-C 对待这个特殊字符的方式与 Python 不同,这就是为什么你会得到不同的结果。

null 字符不应出现在“普通”字符串的中间。您还拥有不应在“正常”字符串中找到的 ASCII 码 8 (backspace)。

删除这些特殊字符时,您应该得到相同的结果。

编辑:

为了清楚起见,问题不在于 base64 编码。 Base64 可以毫无问题地处理二进制数据(当然还有值 0 和 8)。问题是您从整数值转换为字符值。

我不是 Objective-C 专家,但由于您似乎正在处理二进制数据,您可能有兴趣尝试这样的事情:

Byte bytes[] = {119,38,149,28,73,136,86,199,8,225,36,222,129,63,27,102,41,227,39,113,90, 
         92,150,117,130,106,134,255,182,11,0,198,110,41,175,208,158,57,211,197}; 
NSData *tempData = [NSData dataWithBytes:bytes length:40];
NSString *b64String = [tempData base64EncodedStringWithOptions:0]; 
NSLog(@"%@",b64String);   

【讨论】:

  • 问题是:服务器端使用python3对base64编码和解码,我无法控制服务器端。在 ios 端,我需要对字符串进行 base64 编码以连接到服务器站点。 ascii 代码 0 有时会出现。我需要找到一种方法在 ios 中进行 base64 编码,就像 Python3 一样。
  • 我明白了。您可能想要处理二进制数据。请查看我的编辑更新。
猜你喜欢
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
  • 2023-03-22
  • 1970-01-01
  • 2018-02-28
  • 2017-02-04
  • 2021-08-09
相关资源
最近更新 更多