码迷,mamicode.com
首页 > 其他好文 > 详细

Base64编码

时间:2015-05-02 09:41:58      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:base64   编码   

Base64简介

       Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个位元为一个单元,对应某个可打印字符。三个字节有24个位元,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后binhex的版本使用不同的64字符集来代表6个二进制数字,但是它们不叫Base64。

      Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email、在XML中存储复杂数据。

编码过程

1)base64的编码都是按字符串长度,以每3个8bit的字符为一组,
2)针对每组,首先获取每个字符的ASCII编码,
3)将ASCII编码转换成8bit的二进制,得到一组3*8=24bit的字节
4)再将这24bit划分为4个6bit的字节,并在每个6bit的字节前面都填两个高位0,得到4个8bit的字节
5)然后将这4个8bit的字节转换成10进制,对照Base64编码表 ,得到对应编码后的字符。

(注:1. 要求被编码字符是8bit的,所以须在ASCII编码范围内,\u0000-\u00ff,中文就不行。
   2. 如果被编码字符长度不是3的倍数的时候,则都用0代替,对应的输出字符为=)

编码举例:Lucy

                               L             u                        c                   y
ASCII:                   76          117                     99              121
8bit字节:     01001100    01110101    01100011       01111001      00000000    00000000
6bit字节:       010011         000111        010101           100011      011110          010000     000000    000000
十进制:             19                  7               21                   35             30                   16          (异常)      (异常)      
对应编码:           T                  H                 V                     j               e                      Q               =             =

Base64实现

下面是libghttp库中base64编码的实现,非常的简洁清晰。

<span style="font-size:18px;">#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//b64对应表
const char b64_alphabet[65] = {
		"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
		"abcdefghijklmnopqrstuvwxyz"
		"0123456789+/=" };

char *
http_base64_encode(const char *text) {
	/* The tricky thing about this is doing the padding at the end,
	 * doing the bit manipulation requires a bit of concentration only */
	char	*buffer = NULL;
	char	*point = NULL;
	int 	inlen = 0;
	int 	outlen = 0;

	/* check our args */
	if (text == NULL)
		return NULL;

	/* Use 'buffer' to store the output. Work out how big it should be...
	 * This must be a multiple of 4 bytes */

	inlen = strlen(text);
	/* check our arg...avoid a pesky FPE */
	if (inlen == 0) {
		buffer = malloc(sizeof(char));
		buffer[0] = '\0';
		return buffer;
	}
	outlen = (inlen * 4) / 3;//得到输出长度
	if ((inlen % 3) > 0) /* got to pad */
		outlen += 4 - (inlen % 3);

	buffer = malloc(outlen + 1); /* +1 for the \0 */
	memset(buffer, 0, outlen + 1); /* initialize to zero */

	/* now do the main stage of conversion, 3 bytes at a time,
	 * leave the trailing bytes (if there are any) for later */

	for (point = buffer; inlen >= 3; inlen -= 3, text += 3) {
		*(point++) = b64_alphabet[*text >> 2];
		*(point++) = b64_alphabet[(*text << 4 & 0x30) | *(text + 1) >> 4];
		*(point++) = b64_alphabet[(*(text + 1) << 2 & 0x3c) | *(text + 2) >> 6];
		*(point++) = b64_alphabet[*(text + 2) & 0x3f];
	}

	/* Now deal with the trailing bytes */
	if (inlen) {
		/* We always have one trailing byte */
		*(point++) = b64_alphabet[*text >> 2];
		*(point++) = b64_alphabet[(*text << 4 & 0x30)
				| (inlen == 2 ? *(text + 1) >> 4 : 0)];
		*(point++) = (inlen == 1 ? '=' : b64_alphabet[*(text + 1) << 2 & 0x3c]);
		*(point++) = '=';
	}

	*point = '\0';

	return buffer;
}</span>

参考:

http://zh.wikipedia.org/wiki/Base64

http://www.cnblogs.com/hongru/archive/2012/01/14/2321397.html

Base64编码

标签:base64   编码   

原文地址:http://blog.csdn.net/tangchenchan/article/details/45423029

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!