用C语言实现简单的Base64编码

概述

Base64(维基百科)

代码

config.h

#ifndef BASE64_CONFIG_H
#define BASE64_CONFIG_H
//----------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <malloc.h>
char base64_table[] = {
        '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','+', '/', '\0'
};
//----------------------------------------------
#endif //BASE64_CONFIG_H

main.c

#include "config.h"
#include <windows.h>

void drawMenu();
void base64_map(uint8_t *in_block, int length);
void base64_unmap(char *in_block);
void base64_encode(char *in_block,int length,uint8_t *out_block);
void base64_decode(char *in_block,int length,uint8_t *out_block);
int main() {
    while(1)
    {
        drawMenu();
        char c=(char)getchar();
        getchar();//吸收回车
        system("cls");
        if(c=='3')
        {
            exit(0);
        }
        else if(c=='1')
        {
            printf("----base64加密----\n");
            char text[1024];
            gets(text);
            uint8_t * result=(uint8_t*)malloc(sizeof(uint8_t)*1024);
            memset(result,0, sizeof(uint8_t)*1024);
            base64_encode(text,(int)strlen(text),result);
            int length = (int)((strlen(text)*4-1)/3+1);
            length=length%4==3?length+1:length+2;
            int i=0;
            while(i<length)
            {
                printf("%c",result[i]);
                ++i;
            }
            printf("\n");
            break;
        }
        else if(c=='2')
        {
            printf("----base64解密----\n");
            char text[1024];
            gets(text);
            uint8_t * result=(uint8_t*)malloc(sizeof(uint8_t)*1024);
            memset(result,0, sizeof(uint8_t)*1024);
            base64_decode(text,(int)strlen(text),result);
            int length=(int)strlen(text);
            int n=length;
            while(text[--n]=='=');
            if(n==length-2)
            {
                length=(length>>2)*3-1;
            }
            else if(n==length-3)
            {
                length=(length>>2)*3-2;
            }
            else if(n==length-1)
            {
                length=(length>>2)*3;
            }
            for(int i=0;i<length;++i)
            {
                printf("%c",result[i]);
            }
            printf("\n");
            break;
        }
    }
    printf("----输入q退出程序----\n");
    char c=(char)getchar();
    while(1)
    {
        if(c=='q')
        {
            break;
        }
        else
        {
            c=(char)getchar();
        }
    }
    return 0;
}
void drawMenu()
{
    printf("***************\n");
    printf("*1、base64加密\n");
    printf("*2、base64解密\n");
    printf("*3、退出程序\n");
    printf("***************\n");
}
void base64_encode(char *in_block,int length,uint8_t *out_block)
{
    uint8_t *temp=out_block;
    char t[3];
    int i=0;
    while(i<length)
    {
        memset(t,0,3);
        memcpy(t,in_block,i+3<length?3:length-i);
        memset(out_block,0,4);

        out_block[0]=(t[0]>>2)&0x3f;
        out_block[1]=((t[0]<<4)&0x30)|((t[1]>>4)&0x0f);
        out_block[2]=((t[1]<<2)&0x3c)|((t[2]>>6)&0x03);
        out_block[3]=(t[2])&0x3f;

        out_block += 4;
        in_block +=3;
        i+=3;
    }
    base64_map(temp,(length*4-1)/3+1);
}
void base64_map(uint8_t *in_block, int length)
{
    int i=0;
    while(i<length)
    {
        in_block[i]=base64_table[in_block[i]];
        ++i;
    }
    if(length%4==3)
    {
        in_block[length]='=';
    }
    else if(length%4==2)
    {
        in_block[length]=in_block[length+1]='=';
    }
}
void base64_decode(char *in_block,int length,uint8_t *out_block)
{
    char t[4];
    int i=0;
    while(i<length)
    {
        if(*in_block=='=')
        {
            return;
        }
        memcpy(t,in_block,4);
        memset(out_block,0,3);
        base64_unmap(t);
        out_block[0]=((t[0]<<2)&0xfc)|((t[1]>>4)&3);
        out_block[1]=((t[1]<<4)&0xf0)|((t[2]>>2)&0xf);
        out_block[2]=((t[2]<<6)&0xc0)|(t[3]&0x3f);

        out_block+=3;
        in_block+=4;
        i+=4;
    }
}
void base64_unmap(char *in_block)
{
    char *c;
    for(int i=0;i<4;++i)
    {
        c=in_block+i;
        if(*c>='A'&&*c<='Z')
        {
            *c-='A';
            continue;
        }
        if(*c>='a'&&*c<='z')
        {
            *c-='a';
            *c+=26;
            continue;
        }
        if(*c=='+')
        {
            *c=62;
            continue;
        }
        if(*c=='/')
        {
            *c=63;
            continue;
        }
        if(*c=='=')
        {
            *c=0;
            continue;
        }
        *c-='0';
        *c+=52;
    }
}

效果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


Base64在线加解密

发布了169 篇原创文章 · 获赞 244 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/Deep___Learning/article/details/104344712
今日推荐