经过前几篇的文章,大家应该都能预感到一定要讲解 base64 函数的内容了。是的,马上要到程序登录的代码,base64 是必须要实现的。
base64 很早以前我就接触了,在项目中也很喜欢用。但每换一个新语言我总是很害怕,很排斥用它。这主要是缘于曾经的经历:多年前 base64 还没有这样普及,为了在 java 中使用 base64 找了很多的代码,虽然 jdk 中是有,但那是 sun 专用的,在网上找倒是很多,但要自己改造一下是非常的困难(其实是 java 的语言特性导致很复杂,base64 本身还是很简单的)。因为找了很多的文档一直都似懂非懂,因为不懂嘛,所以心理上就有排斥。直到我接了一个 xmpp 的项目必须要在纯 C 中实现 base64 时仔细研究了一下,其实是很简单的。说实在的关于 base64 的文章和前面提到的多线程文章一样也挺汗牛充栋的,为什么我不讲解多线程,要特别讲解 base64 呢?
因为我觉得网上的 base64 讲解文章基本上都是没用的!所以我一定要再写一篇。而我这篇,我保证您一定能看得懂!
首先我先给出完整代码,大家也可以到 github 地址去下载:
https://github.com/clqsrc/c_lib_lstring/tree/master/base64
核心的代码直接就来自博客园的博友,在 rfc 文档和其他一些地方也很容易找到。我直接再贴一个 C++ 的版本,这些代码我都默认折叠了,因为先看代码你是学不会的。
//算法来自 http://www.cnblogs.com/IwAdream/p/6088283.html, 加了我自己的注释 //基本上就是靠移位算法将 3 个字节变成 4 个字节,或者将 4 个字节变成 三个字节 //可以看 https://zh.wikipedia.org/wiki/Base64 中的表格图示 //图片可以在本源码中附带的 base64.png 中看到[如果转载的网友也转载有图片的话就会有] //其实一张图就能明白它的原理 //把变量提前以便更多编译器支持 #ifndef _BASE64_H_ #define _BASE64_H_ #include <stdio.h> #include <stdint.h> //clq 这个其实也不是必须的 #include <string.h> #include <malloc.h> //clq 可以不用,有时会冲突 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','+', '/', '