Base64编码【C语言】

密码学课程结束了,想着尽可能的 把每种加密算法都能用代码 实现一下。

今天的是base64编码是比较简单的。

1.首先就是将字符串分组,按位进行分,每6位一组;不足6位的补上0.

2.然后分别将6位 变成字节的 形式,就是在每6位的前面加上 两个0凑够8位。

3.然后在一个列表中根据这个值作为 索引找到编码后的字符。

Q:整体上是输入的字符串3个字节一组,然后根据位,每6位 代表一个字符,然后转换成 字节,变成编码后的4个字节一组。 如果不能恰好按照3个字节转换成 编码后的4个字节, 就要在编码后的字节补上=,使其 凑够4个字节一组。

{'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',

'+','/'}; 

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

char List[]={'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','+','/'}; 
//3-->4 
//base64编码是根据字符串的长度进行分割的,首先3个一组就是24位  再将24位以6位进行分割,前面补上两个0,保证组成的新的八位范围是0-63,然后根据此索引在上面的数组进行查找
//如果待处理的字符串不能恰好3个一组需要进行补位。首先按照原字符串进行原规则进行编码,编码后发现不足4字节就会补=号 
//6-x%6确定补0的个数
// 
char* base64(char *str,int strlen,int n_zero);
int main()
{
	char str[1000];//预存输入的字符串
	int n_zero=0;//补0的个数 
	char* xinde;
	printf("please input the string needed:");scanf("%s",str) ;
	if(strlen(str)*8%6)
		n_zero=6-strlen(str)*8%6;
	xinde=base64(str,strlen(str),n_zero);
	printf("base64:%s",xinde);
	system("pause");
	
	
} 

char* base64(char *str,int strlen,int n_zero)//str是原字符串,strlen是原字符串的长度,第三个参数是需要补的0的个数 
{
//	
//	(strlen*8+n_zero)/6是补0后的字符串长度 
//	4-((strlen*8+n_zero)/6)%4是需要添加的=号个数 
	char *temp;//用于存放补0后的字符串 和=号 

	bool bit[1000];//用于操作位
	int i,j,cx=0;
	char c;
	if(((strlen*8+n_zero)/6)%4){
		temp=(char*)malloc((strlen*8+n_zero)/6+4-((strlen*8+n_zero)/6)%4+1);
		temp[(strlen*8+n_zero)/6+4-((strlen*8+n_zero)/6)%4]=0;
	}
	else{
		temp=(char*)malloc((strlen*8+n_zero)/6+1);
		temp[(strlen*8+n_zero)/6+1]=0;
	}
	

//	
//	下面是进行位的转换 
//		
	for(i=0;i<strlen;i++)//遍历每个字符 
	{
		c=str[i];
		for(j=0;j<=7;j++)//用于移位 
		{
			bit[cx]=(unsigned char)(c<<j)&(unsigned char)(0x80);
			cx++;
		}
	} 
//	01100100d 0110 1001 i
//	进行补零 
//		
	for(i=0;i<n_zero;i++)
	{
		bit[cx]=0;
		cx++;
	}
//	
//	下面进行分组,由8位一个字节,到6位一个字节 
//	
	cx=0;
	for(i=0;i<(strlen*8+n_zero)/6;i++)
	{
		
		temp[i]&=0;//全部位置零 
		for(j=5;j>=0;j--)//6bit转向8bit 
		{
			c=bit[cx];//先转成字节,方便进行移位 
			temp[i]|=(unsigned char)c<<j;
			cx++;
		}
		temp[i]=List[temp[i]];//映射 
	}
//	
//	6位转8位成功,然后就是涉及到关于=号的添加 ,4-x%4 
//	
	if(((strlen*8+n_zero)/6)%4)
		for(i=(strlen*8+n_zero)/6;i<(strlen*8+n_zero)/6+4-((strlen*8+n_zero)/6)%4;i++)
			temp[i]='=';
	return temp;
	
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值