zoukankan      html  css  js  c++  java
  • C语言 实现base64

    #include <stdio.h> 
    const char base[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; 
    char* base64_encode(const char* data, int data_len); 
    char *base64_decode(const char* data, int data_len); 
    static char find_pos(char ch); 
    int main(int argc, char* argv[]) 
    { 
        char *t = "那个abcd你好吗,哈哈,ANMOL"; 
        int i = 0; 
        int j = strlen(t); 
        char *enc = base64_encode(t, j); 
        int len = strlen(enc); 
        char *dec = base64_decode(enc, len); 
        printf("
    original: %s
    ", t); 
        printf("
    encoded : %s
    ", enc); 
        printf("
    decoded : %s
    ", dec); 
        free(enc); 
        free(dec); 
        return 0; 
    } 
    /* */ 
    char *base64_encode(const char* data, int data_len) 
    { 
        //int data_len = strlen(data); 
        int prepare = 0; 
        int ret_len; 
        int temp = 0; 
        char *ret = NULL; 
        char *f = NULL; 
        int tmp = 0; 
        char changed[4]; 
        int i = 0; 
        ret_len = data_len / 3; 
        temp = data_len % 3; 
        if (temp > 0) 
        { 
            ret_len += 1; 
        } 
        ret_len = ret_len*4 + 1; 
        ret = (char *)malloc(ret_len); 
    
        if ( ret == NULL) 
        { 
            printf("No enough memory.
    "); 
            exit(0); 
        } 
        memset(ret, 0, ret_len); 
        f = ret; 
        while (tmp < data_len) 
        { 
            temp = 0; 
            prepare = 0; 
            memset(changed, '', 4); 
            while (temp < 3) 
            { 
                //printf("tmp = %d
    ", tmp); 
                if (tmp >= data_len) 
                { 
                    break; 
                } 
                prepare = ((prepare << 8) | (data[tmp] & 0xFF)); 
                tmp++; 
                temp++; 
            } 
            prepare = (prepare<<((3-temp)*8)); 
            //printf("before for : temp = %d, prepare = %d
    ", temp, prepare); 
            for (i = 0; i < 4 ;i++ ) 
            { 
                if (temp < i) 
                { 
                    changed[i] = 0x40; 
                } 
                else 
                { 
                    changed[i] = (prepare>>((3-i)*6)) & 0x3F; 
                } 
                *f = base[changed[i]]; 
                //printf("%.2X", changed[i]); 
                f++; 
            } 
        } 
        *f = ''; 
    
        return ret; 
    
    } 
    /* */ 
    static char find_pos(char ch)   
    { 
        char *ptr = (char*)strrchr(base, ch);//the last position (the only) in base[] 
        return (ptr - base); 
    } 
    /* */ 
    char *base64_decode(const char *data, int data_len) 
    { 
        int ret_len = (data_len / 4) * 3; 
        int equal_count = 0; 
        char *ret = NULL; 
        char *f = NULL; 
        int tmp = 0; 
        int temp = 0; 
        char need[3]; 
        int prepare = 0; 
        int i = 0; 
        if (*(data + data_len - 1) == '=') 
        { 
            equal_count += 1; 
        } 
        if (*(data + data_len - 2) == '=') 
        { 
            equal_count += 1; 
        } 
        if (*(data + data_len - 3) == '=') 
        {//seems impossible 
            equal_count += 1; 
        } 
        switch (equal_count) 
        { 
        case 0: 
            ret_len += 4;//3 + 1 [1 for NULL] 
            break; 
        case 1: 
            ret_len += 4;//Ceil((6*3)/8)+1 
            break; 
        case 2: 
            ret_len += 3;//Ceil((6*2)/8)+1 
            break; 
        case 3: 
            ret_len += 2;//Ceil((6*1)/8)+1 
            break; 
        } 
        ret = (char *)malloc(ret_len); 
        if (ret == NULL) 
        { 
            printf("No enough memory.
    "); 
            exit(0); 
        } 
        memset(ret, 0, ret_len); 
        f = ret; 
        while (tmp < (data_len - equal_count)) 
        { 
            temp = 0; 
            prepare = 0; 
            memset(need, 0, 4); 
            while (temp < 4) 
            { 
                if (tmp >= (data_len - equal_count)) 
                { 
                    break; 
                } 
                prepare = (prepare << 6) | (find_pos(data[tmp])); 
                temp++; 
                tmp++; 
            } 
            prepare = prepare << ((4-temp) * 6); 
            for (i=0; i<3 ;i++ ) 
            { 
                if (i == temp) 
                { 
                    break; 
                } 
                *f = (char)((prepare>>((2-i)*8)) & 0xFF); 
                f++; 
            } 
        } 
        *f = ''; 
        return ret; 
    }
    <script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split(' ').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
  • 相关阅读:
    Vuex核心属性(上)
    layui 将json字符串以表格的形式展现出来
    Vue 路由懒加载 和 路由导航守卫
    jq遍历服务器发送过来的json字符串
    前端的发展
    关于定义函数的几种方式 及(箭头函数)
    js 子页面获取父页面的值
    关于数组的响应式方法和非响应式方法
    python3 -- random 模块
    多任务编程 -- multiprocessing 模块(创建多进程、进程池使用、进程间通信)
  • 原文地址:https://www.cnblogs.com/lindexi/p/6949704.html
Copyright © 2011-2022 走看看