⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bas64_encode.c

📁 Base64 加密算法(Author 蒋柏良 Jerry Jiang)
💻 C
字号:
/* Source code for question 3: Base64 encoding API  by Jerry Jiang , Mar 30 2009*/

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

const char base64_map[] ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

size_t b64_length(size_t len)
{
	int npad = len%3;
	size_t  size = (npad > 0)? (len +3-npad ) : len; // padded for multiple of 3 bytes
	return  (size*8)/6;
}

void b64_encode(const void * src, size_t len, void * dst)
{
	char *srcp = (char *)src;
	char *dstp = (char *)dst;

	int pad_len = len%3,new_len;//length after padded
    if(pad_len != 0){
		pad_len = 3 - pad_len;
		new_len = len+pad_len;
	}
	else
		new_len = len;

	unsigned char byte4[4],*bit24= &byte4[0], left;
	register int i = 0,j=0, k = 0;

	while( k < new_len){

		*bit24++ = (k++ < len) ? *srcp++ : 0;

		if(i++ == 2) // 3 Bytes are ready for encoding 3*8
		{
			bit24 -= 3; //go back to the byte4[0]
			for(j = 0; j < 4; j++)
			{
				switch (j)
				{
					case 0:
					*dstp++ = base64_map[(*bit24>>2)&0x3f];
					left = (bit24[0] << 4)&& 0x30 ;
					break;
					case 1:
					*dstp++ = base64_map[(left+(*(bit24+1)>>4))&0x3f];
					left = (bit24[1] << 2)&0x36;
					break;
					case 2:
					*dstp++ = base64_map[(left+(*(bit24+2)>>6))&0x3f];
					break;
					case 3:
					*dstp++ = base64_map[*(bit24+2)&0x3f];
					break;
				}
			}
			i = 0;
		}
	}
	if(pad_len == 1)  //padded 1 bytes '='
		*(dstp-1) = '=';
	else if(pad_len == 2) //padded 2 bytes of '='
	{
		*(dstp-1) = '=';
		*(dstp-2) = '=';
	}
	*dstp = '\0';
}

main()
{
	unsigned char src[3];  //00000000 01000101 11110010 in binary
	
	src[0] = 0x00;
	src[1] = 0x45;
	src[2] = 0xf2;

	char* dst = (char*)malloc( b64_length(3)+1);
	if(dst == NULL)
		return;

	b64_encode(src,3,dst);
	printf("Convert string [0x00 0x45 0xf2]  to [%s]\n",dst);
	printf("Try to encode another string(q exit) ,input: \n",dst);
	free(dst);

	char src_string[1024];
	while(1) {
		scanf("%s",src_string);
		if(src_string[0] == 'q')
			break;
		dst = (char*)malloc( b64_length(strlen(src_string))+1);
		if(dst == NULL)
			break;
		b64_encode(src_string,strlen(src_string),dst);
		printf("Encoded string is [%s]\n",dst);
		free(dst);
	}

	getchar();

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -