3_07_GLib库入门与实践_Base64编解码

简介

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]#
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值