• Base64 编解码C语言实现


    具体代码如下:

    #

    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("\noriginal: %s\n", t);
    printf("\nencoded : %s\n", enc);
    printf("\ndecoded : %s\n", 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.\n");
    exit(0);
    }
    memset(ret, 0, ret_len);
    f = ret;
    while (tmp < data_len)
    {
    temp = 0;
    prepare = 0;
    memset(changed, '\0', 4);
    while (temp < 3)
    {
    //printf("tmp = %d\n", 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\n", 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 = '\0';

    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.\n");
    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 = '\0';
    return ret;
    }


    这里添加了两个方法find_pos和base64_decode。前者是寻找给定字符在base数组中的位置的,使用了strrchr函数,寻找字符在字符串中最后一次的位置,由于总会存在并且仅存在一次,所以函数结果直接使用。base64_decode函数里边跟encode函数差不多,我没有作注释。

    对于代码中给定的串,运行结果如下:


    original: 那个abcd你好吗,哈哈,ANMOL

    encoded : xMe49mFiY2TE47rDwvCjrLn+uf6jrEFOTU9M

    decoded : 那个abcd你好吗,哈哈,ANMOL

    作者:BuildNewApp
    出处:http://syxchina.cnblogs.comBuildNewApp.com
    本文版权归作者、博客园和百度空间共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则作者会诅咒你的。
    如果您阅读了我的文章并觉得有价值请点击此处,谢谢您的肯定1。
  • 相关阅读:
    mysql5.6版本修改密码
    ASP.NET Core MVC 运行所选代码生成器时出错
    abp ef codefirst 设置默认值
    resharper激活
    Ioc(控制反转)、DI(依赖注入)
    统计mysql数据库中数据表/字段等数量的sql
    HeidiSQL安装和使用教程
    mysql的安装步骤
    项目分层的好处
    Python IDLE 的使用与调试
  • 原文地址:https://www.cnblogs.com/syxchina/p/2197388.html
Copyright © 2020-2023  润新知