iOS NSData Base64 Hex 转换_baodu9451的博客-程序员秘密

iOS  NSData Base64 Hex 转换

原文地址: http://blog.csdn.net/shuangyu1989/article/details/9470939

 

// byte 2 hex
+ (NSString *)stringFromByte:(Byte)byteVal{
    NSMutableString *str = [NSMutableString string];
    
    //取高四位
    Byte byte1 = byteVal>>4;
    //取低四位
    Byte byte2 = byteVal & 0xf;
    //拼接16进制字符串
    [str appendFormat:@"%x",byte1];
    [str appendFormat:@"%x",byte2];
    return str;
}

+ (NSString *)hexStringFromData:(NSData *)data{
    NSMutableString *str = [NSMutableString string];
    Byte *byte = (Byte *)[data bytes];
    for (int i = 0; i<[data length]; i++) {
        // byte+i为指针
        [str appendString:[self stringFromByte:*(byte+i)]];
    }
    return str;
}


// hex 2 byte
+ (NSData *)dataFromHexString:(NSString *)hexStr{
    if (hexStr.length%2 != 0) {
        return nil;
    }
    NSMutableData *data = [[NSMutableData alloc] init];
    for (int i = 0 ; i<hexStr.length/2; i++) {
        NSString *str = [hexStr substringWithRange:NSMakeRange(i*2,2)];
        NSScanner *scanner = [NSScanner scannerWithString:str];
        int intValue;
        [scanner scanInt:&intValue];
        [data appendBytes:&intValue length:1];
    }
    return data;
}


// data 2 base64
+ (NSString*) base64Encode:(NSData *)data{
    static char base64EncodingTable[64] = {
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
        'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
        'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
        'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
    };
    NSInteger length = [data length];
    unsigned long ixtext, lentext;
    long ctremaining;
    unsigned char input[3], output[4];
    short i, charsonline = 0, ctcopy;
    const unsigned char *raw;
    NSMutableString *result;
    
    lentext = [data length];
    if (lentext < 1)
        return @"";
    result = [NSMutableString stringWithCapacity: lentext];
    raw = [data bytes];
    ixtext = 0;
    
    while (true) {
        ctremaining = lentext - ixtext;
        if (ctremaining <= 0)
            break;
        for (i = 0; i < 3; i++) {
            unsigned long ix = ixtext + i;
            if (ix < lentext)
                input[i] = raw[ix];
            else
                input[i] = 0;
        }
        output[0] = (input[0] & 0xFC) >> 2;
        output[1] = ((input[0] & 0x03) << 4) | ((input[1] & 0xF0) >> 4);
        output[2] = ((input[1] & 0x0F) << 2) | ((input[2] & 0xC0) >> 6);
        output[3] = input[2] & 0x3F;
        ctcopy = 4;
        switch (ctremaining) {
            case 1:
                ctcopy = 2;
                break;
            case 2:
                ctcopy = 3;
                break;
        }
        
        for (i = 0; i < ctcopy; i++)
            [result appendString: [NSString stringWithFormat: @"%c", base64EncodingTable[output[i]]]];
        
        for (i = ctcopy; i < 4; i++)
            [result appendString: @"="];
        
        ixtext += 3;
        charsonline += 4;
        
        if ((length > 0) && (charsonline >= length))
            charsonline = 0;
    }
    return result;
}



// Base64 2 Data
+ (NSData*) base64Decode:(NSString *)string{
    unsigned long ixtext, lentext;
    unsigned char ch, inbuf[4], outbuf[4];
    short i, ixinbuf;
    Boolean flignore, flendtext = false;
    const unsigned char *tempcstring;
    NSMutableData *theData;
    
    if (string == nil) {
        return [NSData data];
    }
    
    ixtext = 0;
    
    tempcstring = (const unsigned char *)[string UTF8String];
    
    lentext = [string length];
    
    theData = [NSMutableData dataWithCapacity: lentext];
    
    ixinbuf = 0;
    
    while (true) {
        if (ixtext >= lentext){
            break;
        }
        
        ch = tempcstring [ixtext++];
        
        flignore = false;
        
        if ((ch >= 'A') && (ch <= 'Z')) {
            ch = ch - 'A';
        } else if ((ch >= 'a') && (ch <= 'z')) {
            ch = ch - 'a' + 26;
        } else if ((ch >= '0') && (ch <= '9')) {
            ch = ch - '0' + 52;
        } else if (ch == '+') {
            ch = 62;
        } else if (ch == '=') {
            flendtext = true;
        } else if (ch == '/') {
            ch = 63;
        } else {
            flignore = true;
        }
        
        if (!flignore) {
            short ctcharsinbuf = 3;
            Boolean flbreak = false;
            
            if (flendtext) {
                if (ixinbuf == 0) {
                    break;
                }
                
                if ((ixinbuf == 1) || (ixinbuf == 2)) {
                    ctcharsinbuf = 1;
                } else {
                    ctcharsinbuf = 2;
                }
                
                ixinbuf = 3;
                
                flbreak = true;
            }
            
            inbuf [ixinbuf++] = ch;
            
            if (ixinbuf == 4) {
                ixinbuf = 0;
                
                outbuf[0] = (inbuf[0] << 2) | ((inbuf[1] & 0x30) >> 4);
                outbuf[1] = ((inbuf[1] & 0x0F) << 4) | ((inbuf[2] & 0x3C) >> 2);
                outbuf[2] = ((inbuf[2] & 0x03) << 6) | (inbuf[3] & 0x3F);
                
                for (i = 0; i < ctcharsinbuf; i++) {
                    [theData appendBytes: &outbuf[i] length: 1];
                }
            }
            
            if (flbreak) {
                break;
            }
        }
    }
    
    return theData;
}

  

转载于:https://www.cnblogs.com/FranZhou/p/5851952.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baodu9451/article/details/102231420

智能推荐

selenium webdriver 以代理proxy方式启动firefox,ie,chrome_iteye_21060的博客-程序员秘密

[b]原创文章,转载请注明出处:http://passerbyy.iteye.com/blog/1286292 作者:passer_by[/b][size=large]1.题前话 [/size]没有发现之前,自己傻不垃圾的自己写了各个浏览器修改代理的方法,结果发现webdriver有现成,悔恨不已,希望其他同仁能够少走弯路。本文是在Webdriver 2.12.0下面测试...

【kubernetes/k8s源码分析】kubectl-controller-manager之cronjob源码分析_张忠琳的博客-程序员秘密

crontab的基本格式 支持 , - * / 四个字符 *:表示匹配任意值,如果在Minutes 中使用表示每分钟 /: 表示起始时间开始触发,然后每隔固定时间触发一次, 1  2  3  4   5  command 分  时 日  月  周  命令1代表分钟范围为1~59:为*表示每分...

iOS 自定义导航栏标题和按钮_布怀特的博客-程序员秘密

OS中自定义导航栏标题: UILabel *titleText = [[UILabel alloc] initWithFrame: CGRectMake(160, 0, 120, 50)]; titleText.backgroundColor = [UIColor clearColor]; titleText.textColor=[UIColor w

Webpack4 升级报错 Error: Cannot find module 'webpack-cli/bin/config-yargs' 等(含html-webpack-plugin)_cannot find module 'webpack-bundle-analyzer_维一 CN的博客-程序员秘密

问题一 Error: Cannot find module 'webpack-cli/bin/config-yargs'问题二 TypeError: compilation.mainTemplate.applyPluginsWaterfall is not a function问题三 TypeError: Cannot read property 'eslint' of undefined问题四 TypeError: Cannot read property 'vue' of undefined

Luaj学习笔记(三) - LuaJ创建AWT窗体的应用示例_猿长大人的博客-程序员秘密

Luaj学习笔记(三) - LuaJ创建AWT窗体的应用示例Luaj学习笔记(三) - LuaJ创建AWT窗体的应用示例项目文件结构入口程序宠物狗类Lua脚本运行截图结束语项目文件结构项目目录结构如下: 入口程序命名为Test.java的Java程序文件。package pers.landriesnidis.testluaj;impor...

Nginx启动错误:error while loading shared libraries: libpcre.so.1_weixin_30458043的博客-程序员秘密

1# /usr/local/nginx/sbin/nginx2/usr/local/nginx/sbin/nginx: errorwhileloading shared libraries: libpcre.so.1: cannotopenshared objectfile: No suchfil...

随便推点

基于模拟退火(SA)的车辆路径问题(VRP)(Matlab代码实现)_模拟退火算法解决vrp_荔枝科研社的博客-程序员秘密

大家应该都知道旅行商问题(TSP,Traveling Salesman Problem),即求一个旅行家从一个仓库出发,通过沿途所有城市,再回到仓库所需要的最短路径。TSP问题中只有一个旅行商,那我们如何去解决有多个旅行商(车辆)同时送货的问题呢?让我们来想一个特例,80座城市,分布在四个角上,仓库在正中间,总共有四辆车。也就是说,TSP问题是VRP问题的一个特例(不考虑capacity并且只有一辆车的情况)。博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。部分理论来源于网络,如有侵权请联系删除。

Java程序员应该掌握哪些东西?_weixin_33695082的博客-程序员秘密

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

Trick_weixin_30436891的博客-程序员秘密

Windows Echo命令 1)格式:ECHO. 输出空行,即相当于输入一个回车. 值得注意的是命令行中的“.”要紧跟在ECHO后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。另外“.”可以用,:;”/[\]+等任一符号替代。 在下面的例子中ECHO.输出的回车,经D...

【ITOO技术篇】Easyui datagrid中添加 Combobox_Emily呀的博客-程序员秘密

前言:    应项目业务要求,需要在easyui封装的datagrid表格中加入combobox下拉框,以便用户给用户选择。

面试整理_qq_20962187的博客-程序员秘密

数据分析/hadoop/机器学习面试题集锦,可能是最全的了… 发表于:2017-09-21 15:17阅读:178评论:0无论你是想从事大数据相关职位的职场小白,还是准备往高处走的牛牛。小白有了这些在校招中过关斩将,牛牛们温故知新跨过业务壁垒。B格高的HR,或者想要个助理的大数据工作者也可以了解下同行是怎么筛选人。非主流的可以拿来撩HR妹纸,折腾面试的小鲜肉…………………………数...

java 迭代器 entryset_java迭代器_冷眼看电视的博客-程序员秘密

迭代器不同java集合(容器)的内部结构是不一样的,如果为每种容器都单独实现一种遍历方法十分麻烦,为了简化遍历容器的操作,所以推出了java迭代器(Iterator)通过java迭代器,我们可以用统一的方法实现对容器的遍历,极大地简化了操作.迭代器接口1.java.util.Iterator接口public interface Iterator {//查询容器中是否存在下一个元素boolean h...