Glib学习(24) Base64编解码 Base64 Encoding

glib源码下载:http://ftp.gnome.org/pub/gnome/sources/glib/
glib帮助文档:https://developer.gnome.org/glib/

以Base64格式对数据进行编码和解码

Includes
#include <glib.h>
#include <glib/gi18n.h>

描述


Base64是一种编码,允许将任意字节序列编码为可打印ASCII字符序列。 有关Base64的定义,请参阅RFC 1421或RFC 2045.Base64最常用作电子邮件的MIME传输编码。
GLib支持使用g_base64_encode_step()和g_base64_encode_close()进行增量编码。 可以使用g_base64_decode_step()完成增量解码。 要一次编码或解码数据,请使用g_base64_encode()或g_base64_decode()。 要在解码时避免内存分配,可以使用g_base64_decode_inplace()。

函数

g_base64_encode_step ()

将二进制数据序列递增编码为其Base-64字符串表示。 通过多次调用此函数,您可以以块的形式转换数据,以避免必须在内存中包含完整的编码数据。
转换完所有数据后,必须调用g_base64_encode_close()来刷新已保存的状态。
输出缓冲区必须足够大,以适合将写入的所有数据。 由于base64编码方式至少需要:(len / 3 + 1)* 4 + 4字节(非零状态时可能需要+4)。 如果启用line-breaking,则至少需要:((len / 3 + 1)* 4 + 4)/ 72 + 1个字节的额外空间。
在将base64编码的数据放入电子邮件中时,通常会使用break_lines。 它将行分为72列而不是将所有文本放在同一行上。 这避免了电子邮件系统中长行的问题。 但请注意,它会使用LF字符而不是CR LF序列中断行,因此结果无法直接传递给SMTP或某些其他协议。

g_base64_encode_close ()

将状态从一系列调用刷新到g_base64_encode_step()。
输出缓冲区必须足够大,以适合将写入的所有数据。 如果启用了换行,它将需要最多4个字节,或最多5个字节。
out数组不会自动以null结尾。

g_base64_encode ()

将二进制数据序列编码为其Base-64字符串表示。

g_base64_decode_step ()

从Base-64字符串化表示中逐步解码二进制数据序列。 通过多次调用此函数,您可以以块的形式转换数据,以避免必须在内存中包含完整的编码数据。
输出缓冲区必须足够大,以适合将写入的所有数据。 由于base64在4个字符中编码3个字节,因此至少需要:(len / 4)* 3 + 3个字节(在非零状态的情况下可能需要+3个字节)。

g_base64_decode ()

将Base-64编码文本序列解码为二进制数据。 请注意,返回的二进制数据不一定是零终止的,因此不应将其用作字符串。

g_base64_decode_inplace ()

通过覆盖输入数据将一系列Base-64编码文本解码为二进制数据。

例子

#include <glib.h>
#include <glib/gprintf.h>
#include <glib/gi18n.h>
int main(int argc, char **argv)
{
    g_printf ("%s() in\n", __func__);
    guchar *ram = "Encode a sequence of binary data into its Base-64 stringified representation.";
    g_printf ("ram data:%s\n", ram);
    gchar *encode_data = g_base64_encode (ram, strlen(ram));
    g_printf ("encode data:%s\n", encode_data);
    gsize out_len;
    guchar *decode_data = g_base64_decode (encode_data, &out_len);
    g_printf ("decode len:%ld, data:%s\n", out_len, decode_data);
    g_base64_decode_inplace (encode_data, &out_len);
    g_printf ("decode len:%ld, data:%s\n", out_len, encode_data);
    g_free (encode_data);
    g_free (decode_data);
    
    gchar encode_out[256] = {0};
    gint state = 0, save = 0;
    gsize encode_out_len = g_base64_encode_step (ram, strlen(ram), FALSE, encode_out, &state, &save);
    g_printf ("encode_step state:%d, save:%d, len:%ld, data:%s\n", state, save, encode_out_len, encode_out);
    guchar *encode_out_temp = g_memdup (encode_out, 256);
    gsize encode_close_len = g_base64_encode_close (FALSE, encode_out, &state, &save);
    encode_out[encode_close_len] = 0;
    g_printf ("encode_close state:%d, save:%d, len:%ld, data:%s\n", state, save, encode_close_len, encode_out);
    memcpy (&(encode_out_temp[encode_out_len]), encode_out, encode_close_len);
    encode_out_len += encode_close_len;
    g_printf ("encode_out all data:%s\n", (char *)encode_out_temp);
    gchar decode_out[256] = {0};
    gsize decode_out_len = g_base64_decode_step (encode_out_temp, encode_out_len, decode_out, &state, &save);
    g_printf ("decode_step state:%d, save:%d, len:%ld, data:%s\n", state, save, decode_out_len, decode_out);
    g_printf ("%s() out\n", __func__);
}

输出

main() in
ram data:Encode a sequence of binary data into its Base-64 stringified representation.
encode data:RW5jb2RlIGEgc2VxdWVuY2Ugb2YgYmluYXJ5IGRhdGEgaW50byBpdHMgQmFzZS02NCBzdHJpbmdpZmllZCByZXByZXNlbnRhdGlvbi4=
decode len:77, data:Encode a sequence of binary data into its Base-64 stringified representation.
decode len:77, data:Encode a sequence of binary data into its Base-64 stringified representation.mllZCByZXByZXNlbnRhdGlvbi4=
encode_step state:0, save:3042818, len:100, data:RW5jb2RlIGEgc2VxdWVuY2Ugb2YgYmluYXJ5IGRhdGEgaW50byBpdHMgQmFzZS02NCBzdHJpbmdpZmllZCByZXByZXNlbnRhdGlv
encode_close state:0, save:0, len:4, data:bi4=
encode_out all data:RW5jb2RlIGEgc2VxdWVuY2Ugb2YgYmluYXJ5IGRhdGEgaW50byBpdHMgQmFzZS02NCBzdHJpbmdpZmllZCByZXByZXNlbnRhdGlvbi4=
decode_step state:0, save:1869491712, len:77, data:Encode a sequence of binary data into its Base-64 stringified representation.
main() out

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值