IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Objective-C 对二进制数据 NSData 进行 URL 编码

idea's blog 2016-03-01 23:45:03 累计浏览 1,807 次
本机暂存

   Objective-C 和其它所谓的 Unicode 友好型编程语言, 大多对内存不友好, 这些语言一提到"二进制", 好像就当机了一样.

   所以, 我认为 PHP 确实是最好的编程语言, 对于 PHP 来说, 字符串就是二进制, 二进制就是字符串, 不管你什么字符集. 这并不是说 PHP 支持 Unicode, 事实上, PHP 对 Unicode 的支持是最友好最高级的. 例如, 拿到一段内存, 你想把它当作为 UTF-8 或者 UTF-16, 随你意, 只要你认为它是什么, 它就是什么, 然后, PHP 提供了对应的函数来处理.

   回到题目, 在 Objective-C 里, 要将一段二进制数据(也就是一段内存)进行 urlencode(URL 编码), 应该怎么做? 很不幸, CFURLCreateStringByAddingPercentEscapes() 函数只处理字符串. 没错, 又是字符串! 这就是不把字符串当二进制的坏处!

   所以, 只能自己写一个函数.

static int is_safe_char(char c){
    if(c == '.' || c == '-' || c == '_'){
        return 1;
    }else if(c >= '0' && c <= '9'){
        return 1;
    }else if(c >= 'A' && c <= 'Z'){
        return 1;
    }else if(c >= 'a' && c <= 'z'){
        return 1;
    }
    return 0;
}

static NSString *urlencode_data(NSData *data){
    NSMutableString *ret = [[NSMutableString alloc] init];
    char *ptr = (char *)data.bytes;
    int len = (int)data.length;
    for(int i=0; i<len; i++){
        char c = ptr[i];
        if(is_safe_char(c)){
            [ret appendFormat:@"%c", c];
        }else{
            [ret appendFormat:@"%%%02X", c];
        }
    }
    return ret;
}

同分类推荐文章

  1. 「置顶」我做了什么 (2026-05-05 12:13:28)
  2. 万字长文推演:手机不再从 App 开始,Agent OS 如何接管任务入口 (2026-04-28 14:57:22)
  3. Android Perfetto 系列 10 - Binder 调度与锁竞争 (2025-11-16 15:33:30)

查看更多 移动开发 文章 →

建议继续学习

  1. iOS到Android到底有多远 (累计阅读 4,272)
  2. 趣图三幅:iPhone五年来的变化 (累计阅读 3,761)
  3. 2011互联网技术发展浅析 (累计阅读 2,931)
  4. Objective-C 的对象模型 (累计阅读 2,361)
  5. Swift类型转换 (累计阅读 2,320)
  6. java中文乱码解决之道(八)—–解决URL中文乱码问题 (累计阅读 2,200)
  7. Objective-C Coding Style (累计阅读 2,115)
  8. ios webview 相关 (累计阅读 2,026)
  9. Cocoa处理JSON转换, 兼谈计算机语言的哲学 (累计阅读 1,969)
  10. 为什么不要在init和dealloc函数中使用accessor (累计阅读 1,871)