麻花痒 发表于 2024-6-13 08:53:26

用于将字节进行base64编码或解码(C语言实现)

V1.0 2024年6月13日 发布于博客园

目次

[*]base64.h
[*]base64.c

基本原理见代码注释!
base64.h

#ifndef _BASE64_H
#define _BASE64_H
/**
* @file name : base64.h
* @brief   : 用于将字节进行base64编码或解码
* @author    : RISE_AND_GRIND@163.com
* @date      : 2024年6月12日
* @version   : 1.0
* @note      :
* CopyRight (c)2023-2024   RISE_AND_GRIND@163.com   All Right Reseverd
*/

/**Base64基本介绍
*什么是Base64编码?
*      编码的主要目的是在需要通过文本传输或存储二进制数据的场景中,
*      确保数据的完整性和可读性。直接使用ASCII存储二进制数据存在一些问题,
*      因为二进制数据可能包含不可打印字符或特殊字符,这些字符在某些传输媒介(如电子邮件、URL等)中可能会被误解或破坏。
*为什么要使用Base64?
*      可读性和可传输性:
*          Base64编码将二进制数据转换为可打印的ASCII字符,确保数据在传输过程中不被改变。
*          许多传输协议(如SMTP邮件协议)只支持文本数据,Base64编码使得二进制数据可以通过这些协议传输。
*
*      避免数据损坏:
*          某些传输通道可能会对非文本数据进行处理或修改,Base64编码可以避免这些问题。
*
*      兼容性:
*          Base64编码后的数据可以在不同系统和平台之间无缝传输,而不会受到字符集或编码方式的影响。
*
*Base64的应用:电子邮件附件、Web数据传输(图片、文件等)、数据存储(某些数据库)、加密和签名
*/

/**Base64基本原理
* Base64(64个字符) -->2^6即6个比特-->其字符编码范围为0~63
* -->"A-Z" "a-z" "0~9" "+" "/"
* -->'A-Z' -- 编码范围 0~25
* -->'a-z' -- 编码范围 26~51
* -->'0-9' -- 编码范围 52~61
* -->'+'   -- 编码范围 62
* -->'/'   -- 编码范围 63
*
* 注意, 最后不足4字符会以'='补齐
*
* 例如: 将ASCII码的"Man"转换为Base64编码为TWFu
*M---->ASCII对应值: A(65)+12 = 77--->十六进制:0x4D--->二进制:0100 1101
*a---->ASCII对应值: a(97)+0= 97--->十六进制:0x61--->二进制:0110 0001
*n---->ASCII对应值: a(97)+13 = 110 --->十六进制:0x6E--->二进制:0110 1110
*
*在内存中(ASCII)      :0100 1101 0110 0001 0110 1110
*6位划分为Base64      :010011|010110|000101|101110
*但内存是以字节为单位    :00010011|00010110|00000101|00101110
*Base64显示             : T(19)   W(22)   F(5)   u(46)
*
*所以每3个字节ASCII码会生成4个字节的Base编码
*/
/***************************************头文件***************************************/
#include <stdio.h>
#include <string.h>
/***************************************END******************************************/
// 查找Base64字符在表中的位置, 进行数值还原
int base64_char_value(char c);
/**将字符串进行Base64编码
* @name      base64_encode
* @brief   将字符串进行Base64编码
* @param   input 输入的ASCII字符串
* @param   output得到的base64编码
* @date      2024年6月12日
* @version   1.0
* @note
*/
void base64_encode(const unsigned char *input, char *output);
/**将字符串进行Base64解码
* @name      base64_decode
* @brief   将字符串进行Base64解码
* @param   input 输入的base64编码
* @param   output得到的ASCII字符串
* @date      2024年6月12日
* @version   1.0
* @note
*/
void base64_decode(const char *input, unsigned char *output);
#endifbase64.c

/** * @file name : base64.c * @brief   : 用于将字节进行base64编码或解码 * @author    : RISE_AND_GRIND@163.com * @date      : 2024年6月12日 * @version   : 1.0 * @note      : * CopyRight (c)2023-2024   RISE_AND_GRIND@163.com   All Right Reseverd */#include "../../include/utilities/base64.h"// Base64字符表, 用于编码息争码 static限制为文件域static const char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";// 查找Base64字符在表中的位置, 进行数值还原int base64_char_value(char c){    if (c >= 'A' && c = 'a' && c = '0' && c > 2;                           // a3 & 11111100 取a3的前6位            a4 = ((a3 & 0x03) > 4); // 取a3的后2位和a3的前4位            a4 = ((a3 & 0x0f) > 6); // 取a3的后4位和a3的前2位            a4 = a3 & 0x3f;                                  // 取a3的后6位            for (i = 0; i < 4; i++) // 每次输出4个编码后的字符            {                *output++ = base64_table]; // 将编码后的Base64值映射到Base64字符表, 转换为ASCII码的形式体现(只是体现, 内容是Base64)            }            i = 0; // 重置计数器      }    }    if (i) // 若位数不敷3个字节    {      for (j = i; j < 3; j++) // 用0填充不敷的字节部门      {            a3 = '\0';      }      // 同上利用      a4 = (a3 & 0xfc) >> 2;      a4 = ((a3 & 0x03) > 4);      a4 = ((a3 & 0x0f) > 6);      a4 = a3 & 0x3f;      // 将已编码好的部门输出, +1是因为若只有一个字节也至少生成2个字符, 始终会+1      for (j = 0; j < (i + 1); j++)      {            *output++ = base64_table];      }      while ((i++ < 3))      {            *output++ = '='; // 用'='填充不敷的部门并输出      }    }    *output = '\0'; // 输出字符串完毕}/**将字符串进行Base64解码 * @name      base64_decode * @brief   将字符串进行Base64解码 * @param   input 输入的base64编码 * @param   output得到的ASCII字符串 * @date      2024年6月12日 * @version   1.0 * @note */void base64_decode(const char *input, unsigned char *output){    int i = 0; // 计数器    int j = 0;    unsigned char a4 = {0}; // 每次输入4个Base64字符缓冲区    unsigned char a3 = {0}; // 每次输出3个ASCII码字节缓冲区, 4个Base64编码可生成3个ASCII码    while (*input)    {      for (i = 0; i < 4; i++) // 以4个base字符为单位进行处理      {            if (*input == '=') // 若是末尾            {                a4 = 0; // 转换为'\0'            }            else // 若不是末尾            {                a4 = base64_char_value(*input);            }            input++; // 继续读入1个字符      }      a3 = (a4 > 4);          // 解码第一个字节 取消移位      a3 = ((a4 & 0x0f) > 2); // 解码第二个字节      a3 = ((a4 & 0x03)
页: [1]
查看完整版本: 用于将字节进行base64编码或解码(C语言实现)