美文网首页
c语言编码和解码base64

c语言编码和解码base64

作者: 一路向后 | 来源:发表于2022-05-30 21:42 被阅读0次

1.源码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

unsigned char *base64_encode(unsigned char *str, long str_len);
unsigned char *base64_decode(unsigned char *code, long *str_len);

unsigned char *base64_encode(unsigned char *str, long str_len)
{
    long len;
    unsigned char *res;
    int i,j;
    unsigned char *base64_table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  
    /*计算经过base64编码后的字符串长度*/
    if(str_len % 3 == 0)
    {
        len = str_len / 3 * 4;
    }
    else
    {
        len = (str_len / 3 + 1) * 4;
    }
  
    res = malloc(sizeof(unsigned char)*len+1);
    res[len] = '\0';

    /*以3个8位字符为一组进行编码*/
    for(i=0,j=0;i<len-2;j+=3,i+=4)  
    {
        res[i]=base64_table[str[j]>>2];
        res[i+1]=base64_table[(str[j]&0x3)<<4 | (str[j+1]>>4)];
        res[i+2]=base64_table[(str[j+1]&0xf)<<2 | (str[j+2]>>6)];
        res[i+3]=base64_table[str[j+2]&0x3f];
    }
  
    switch(str_len % 3)
    {
        case 1:
            res[i-2]='=';
            res[i-1]='=';
            break;
        case 2:
            res[i-1]='=';
            break;
    }
  
    return res;
} 

unsigned char *base64_decode(unsigned char *code, long *str_len2)
{  
    /*根据base64表,以字符找到对应的十进制数据*/
    int table[]={0,0,0,0,0,0,0,0,0,0,0,0,
             0,0,0,0,0,0,0,0,0,0,0,0,
             0,0,0,0,0,0,0,0,0,0,0,0,
             0,0,0,0,0,0,0,62,0,0,0,
             63,52,53,54,55,56,57,58,
             59,60,61,0,0,0,0,0,0,0,0,
             1,2,3,4,5,6,7,8,9,10,11,12,
             13,14,15,16,17,18,19,20,21,
             22,23,24,25,0,0,0,0,0,0,26,
             27,28,29,30,31,32,33,34,35,
             36,37,38,39,40,41,42,43,44,
             45,46,47,48,49,50,51
    };

    long len;  
    long str_len;  
    unsigned char *res;  
    int i,j;  
  
    /*计算解码后的字符串长度*/
    len=strlen(code);

    /*判断编码后的字符串后是否有*/
    if(strstr(code,"=="))
        str_len=len/4*3-2;
    else if(strstr(code,"="))
        str_len=len/4*3-1;
    else
        str_len=len/4*3;
  
    res=malloc(sizeof(unsigned char)*str_len+1);  
    res[str_len]='\0';  
  
    /*以4个字符为一位进行解码*/
    for(i=0,j=0;i < len-2;j+=3,i+=4)  
    {  
        res[j]=((unsigned char)table[code[i]])<<2 | (((unsigned char)table[code[i+1]])>>4);
        res[j+1]=(((unsigned char)table[code[i+1]])<<4) | (((unsigned char)table[code[i+2]])>>2);
        res[j+2]=(((unsigned char)table[code[i+2]])<<6) | ((unsigned char)table[code[i+3]]);
    }

    *str_len2 = str_len;
  
    return res;  
} 

int main(int argc, char **argv)
{
    int type = -1;
    int ch;
    char *file[2] = {NULL, NULL};
    char *out = NULL;
    long w = 0;
    long v = 0;

    if(argc != 3 && argc != 4)
    {
        return -1;
    }

    type = 1;
    file[0] = argv[1];
    file[1] = argv[2];

    if(argc == 4)
    {
        if(strcmp(argv[1], "-d") != 0)
        {
            return -1;
        }

        type = 2;
        file[0] = argv[2];
        file[1] = argv[3];
    }

    FILE *rfp = NULL;
    FILE *wfp = NULL;
    unsigned char buf[4*1024*1024];

    rfp = fopen(file[0], "r");
    if(rfp == NULL)
    {
        return -1;
    }

    buf[0] = 0x00;

    while(!feof(rfp))
    {
        ch = fgetc(rfp);

        if(ch != EOF)
        {
            buf[w++] = ch;
        }
    }

    buf[w] = 0x00;

    fclose(rfp);

    if(type == 1)
    {
        out = base64_encode(buf, w);

        v = strlen(out);
    }
    else if(type == 2)
    {
        if(w - 1 >= 0)
        {
            if(isspace(buf[w-1]))
            {
                buf[w-1] = 0x00;
                w--;
            }
        }

        if(w - 1 >= 0)
        {
            if(isspace(buf[w-1]))
            {
                buf[w-1] = 0x00;
                w--;
            }
        }

        out = base64_decode(buf, &v);
    }

    wfp = fopen(file[1], "w");
    if(wfp == NULL)
    {
        free(out);

        return -1;
    }

    fwrite(out, 1, v, wfp);

    fclose(wfp);

    free(out);

    return 0;
}

2.编译源码

$ gcc -o base64 base64.c -std=c89

3.编码及解码

$ ./base64 1.txt 2.txt
$ ./base64 -d 2.txt 3.txt

相关文章

网友评论

      本文标题:c语言编码和解码base64

      本文链接:https://www.haomeiwen.com/subject/gqlaprtx.html