简介
Base64是一种非常常见的数据编码方式。由于其编码时基于64个可打印字符,因此叫做Base64。
数据结构
无
函数列表
gsize g_base64_encode_step ()
gsize g_base64_encode_close ()
gchar * g_base64_encode ()
gsize g_base64_decode_step ()
guchar * g_base64_decode ()
guchar * g_base64_decode_inplace ()
函数功能分类
Base64编解码函数有两类,编码和解码。有时候需要进行编码的数据量比较大,甚至超过了内存,则需要用到分步编码方法,减少对内存的占用,解码时,为了避免重复申请内存,可以使用g_base64_decode_inplace函数。
// 编码函数和解码函数
gchar * g_base64_encode ()
guchar * g_base64_decode ()
// 分步骤编解码
gsize g_base64_encode_step ()
gsize g_base64_decode_step ()
// 分步骤编码关闭函数
gsize g_base64_encode_close ()
// 解码,解码后的数据放入原内存中,不重复申请内存
guchar * g_base64_decode_inplace ()
函数功能说明及综合演示
很多网站提供在线Base64编解码功能,可以将GLib计算出的结果与网络在线计算的结果进行比较,查看是否正确。Linux系统也有计算base64的命令行工具base64
,不过只能读入文件,对比是要特别注意文件结尾的换行符是否参与了计算。
Base64的编码和解码
示例代码如下:
源码见glib_examples\glib_base64\glib_base64_basic
#include <glib.h>
gint main(gint argc, gchar **argv)
{
gsize out_len = 0;
gchar *base64_en_data = NULL;
gchar *base64_de_data = NULL;
const guchar *ori_data = "ABCD\n";
g_print("ori_data: %s \n", ori_data);
base64_en_data = g_base64_encode(ori_data, strlen(ori_data));
g_print("base64 encode:%s -> %s \n", ori_data, base64_en_data);
base64_de_data = g_base64_decode(base64_en_data, &out_len);
g_print("base64 decode:%s -> %s \n", base64_en_data, base64_de_data);
g_free(base64_en_data);
g_free(base64_de_data);
return 0;
}
运行结果:
[root@centos7_6 build]# ./glib_base64_basic
ori_data: ABCD
base64 encode:ABCD
-> QUJDRAo=
base64 decode:QUJDRAo= -> ABCD
Base64的分步编码
示例代码如下:
源码见glib_examples\glib_base64\glib_base64_step_encode
#include <glib.h>
#define GLIB_BASE64_BLOCK_SIZE 16
gint main(gint argc, gchar **argv)
{
gchar *base64_en_data = NULL;
const guchar *ori_data = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ";
g_print("ori_data: %s \n", ori_data);
#if 1
base64_en_data = g_base64_encode(ori_data, strlen(ori_data));
g_print("base64 encode:%s -> %s \n", ori_data, base64_en_data);
g_free(base64_en_data);
#endif
/*encode by step*/
gint processed_len = 0;
gint output_len = 0;
gint state = 0;
gint save = 0;
gboolean line_break = FALSE;
gint ori_data_len = 0;
gchar *en_data = NULL;
ori_data_len = strlen(ori_data);
en_data = g_malloc0((ori_data_len * 4));
while (processed_len < ori_data_len)
{
gint block_size = MIN (GLIB_BASE64_BLOCK_SIZE, ori_data_len - processed_len);
output_len += g_base64_encode_step (ori_data+processed_len, block_size,
line_break, en_data+output_len, &state, &save);
processed_len += block_size;
}
output_len += g_base64_encode_close (line_break, en_data + output_len, &state, &save);
g_print("step en_data:%s \n", en_data);
g_free(en_data);
return 0;
}
运行结果:
[root@centos7_6 build]# ./glib_base64_step_encode
ori_data: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
base64 encode:ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ -> QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFla
step en_data:QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFla
[root@centos7_6 build]#
Base64的分步解码
示例代码如下:
源码见glib_examples\glib_base64\glib_base64_step_decode
#include <glib.h>
#define GLIB_BASE64_BLOCK_SIZE 16
gint main(gint argc, gchar **argv)
{
gchar *base64_en_data = NULL;
const guchar *ori_data = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ";
g_print("ori_data: %s \n", ori_data);
#if 1
base64_en_data = g_base64_encode(ori_data, strlen(ori_data));
g_print("base64 encode:%s -> %s \n", ori_data, base64_en_data);
#endif
/*decode by step*/
gint output_len = 0;
gint state = 0;
gint save = 0;
gint en_data_len = strlen(base64_en_data);
gchar *en_data_ptr = base64_en_data;
gchar *de_data = g_malloc0(strlen(ori_data));
while (en_data_len > 0)
{
gint block_size = MIN (GLIB_BASE64_BLOCK_SIZE, en_data_len);
output_len += g_base64_decode_step (en_data_ptr, block_size, de_data+output_len,
&state, &save);
en_data_ptr += block_size;
en_data_len -= block_size;
}
g_print("decode de_data: %s\n", de_data);
g_free(de_data);
g_free(base64_en_data);
return 0;
}
运行结果:
[root@centos7_6 build]# ./glib_base64_step_decode
ori_data: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
base64 encode:ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
-> QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaCg==
decode de_data: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
[root@centos7_6 build]#