一文搞懂Base64编码原理

article/2025/9/13 6:19:11

Base64是最常见的用于传输8Bit字节码的编码方式之一,它是一种基于64个可打印字符来表示二进制数据的方法。

Base64是什么

Base64编码,是由64个字符组成编码集:26个大写字母AZ,26个小写字母az,10个数字0~9,符号“+”与符号“/”。Base64编码的基本思路是将原始数据的三个字节拆分转化为四个字节,然后根据Base64的对应表,得到对应的编码数据。

当原始数据凑不够三个字节时,编码结果中会使用额外的**符号“=”**来表示这种情况。

Base64编码表

码值字符码值字符码值字符码值字符
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

Base64编码步骤

  • 将原始数据按照每三个字节作为一组进行划分,每组一共是24个二进制位。
  • 再将这24个二进制位,每6个一划分,分为四组(6×4=24个二进制位)。
  • 然后在每组前面补上00,扩展成8×4=32个二进制位,即四个字节(因为每个字节前面有2个0,所以每个字节的最大值是63)。
  • 最后根据Base64编码表,将这四个字节的码值,转换为对应的Base64的字符即可。

Base64编码过程举例

情况1:正常的3个字节编码

将单词“PCB”转换为Base64编码:

  • “P”、“C”、"B"的ASCII值分别是80、67、66,对应的二进制值是0101 0000、0100 0011、0100 0010,将它们连成一个24位的二进制字符串010100000100001101000010。

  • 将这个24位的二进制字符串,每6个一组分成4组:010100、000100、001101、000010。

  • 在每组前面加两个00,扩展成32个二进制位,即四个字节:00010100、00000100、00001101、00000010。它们的十进制值分别是19、22、5、46。(最前面加上两个0只是为了凑成一个字节,实际上其本身的数值是没有变化的)

  • 根据上表,得到每个值对应Base64编码,即U、E、N、C。

情况2:剩余2个字节编码

对于2个字节(16个二进制数)的情况,比如将“PC”转换为Base64编码:

转换方法同上,区别在于:

  • 16个二进制数,每6个一组分割,最后剩余4个,这时再在后面补两个0凑成6个。
  • 然后还按照基础的方法转换,最后补一个“=”即可

转换过程如下表,最终将“PC”转换为了“UEM=”

情况3:剩余1个字节编码

对于12个字节(8个二进制数)的情况,比如将“P”转换为Base64编码:

转换方法同上,区别在于:

  • 16个二进制数,每6个一组分割,最后剩余2个,后面要再补4个0
  • 然后还按照基础的方法转换,最后补两个“=”即可

转换过程如下表,最终将“P”转换为了“UA==”

Base64编解码C程序

编码程序

编码的程序设计思路,就是按照上面讲解的编码过程,每3个原始字符为一组,进行编码,得到4个base64的字符。对于不够3个字符的情况,编码的base64的字符后面补上一到两个=号。

#include <stdio.h>
#include <string.h>/*base64符号表*/
const char *base64Arr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/*base64增补符号*/ 
const char paddingChar = '=';/** @func:  base64_encode
*   @brief: base64编码 
*   @para:  [srcData]:要进行编码的原始数据
*           [resBase64]:base64编码结果 
*   @return:none
*/
void base64_encode(const unsigned char * srcData, char * resBase64)
{int i=0; /*原始数据索引*/ int j=0; /*base64结果索引*/ unsigned char transIdx=0;    // 索引是8位,但是高两位都为0const int srcLen = strlen((const char*)srcData);/*每3个一组,进行编码*/for(i=0; i < srcLen; i+=3) {/*取出第1个字符的高6位*/ transIdx = ((srcData[i] >> 2) & 0x3f); /*0011 1111*//*查表*/ resBase64[j++] = base64Arr[(int)transIdx];/*取出第1个字符的低2位*/ transIdx = ((srcData[i] << 4) & 0x30); /*0011 0000*//*第1个字符后面还有字符*/ if (i + 1 < srcLen) {/*取出第2个字符的高4位,并与第1个字符的低2位进行组合*/ transIdx |= ((srcData[i + 1] >> 4) & 0x0f); /*0000 1111*//*查表*/ resBase64[j++] = base64Arr[(int)transIdx];}else /*第1个字符后面没有字符了*/{/*直接使用第1个字符的低2位查表*/resBase64[j++] = base64Arr[(int)transIdx];/*然后补上两个=号*/ resBase64[j++] = paddingChar;resBase64[j++] = paddingChar;break;   /*没有数据了,break结束*/ }/*取出第2个字符的低4位*/ transIdx = ((srcData[i + 1] << 2) & 0x3c); /*0011 1100*//*第2个字符后面还有字符*/ if (i + 2 < srcLen){ /*取出第3个字符的高2位,并与第2个字符的低4位进行组合*/ transIdx |= ((srcData[i + 2] >> 6) & 0x03);  /*0000 0011*//*查表*/ resBase64[j++] = base64Arr[(int)transIdx];/*取出第3个字符的低6位*/ transIdx = srcData[i + 2] & 0x3f; /*0011 1111*/ /*查表*/ resBase64[j++] = base64Arr[(int)transIdx];}else /*第2个字符后面没有字符了*/{/*直接使用第2个字符的低4位查表*/resBase64[j++] = base64Arr[(int)transIdx];/*然后补上一个=号*/ resBase64[j++] = paddingChar;break;  /*没有数据了,break结束*/ }}/*结束符*/ resBase64[j] = '\0'; 
}

解码程序

解码的程序设计思路,其实就是编码的反过程,把要解码的base64符号,每4个为一组,译码成3个字符。对于最后出现的=的情况,就说明是要结束了,直接使用剩余的base64符号进行译码,然后就结束了。

/** @func:  idx_in_base64Arr
*   @brief: 在base64符号表中查找字符c对应的索引值
*   @para:  [c]:要查找的字符
*   @return:字符c在base64符号表中对应的索引值(0~63) 
*/
int idx_in_base64Arr(char c) 
{/*在base64表中搜索第一次出现字符c的位置*/const char *pIdx = strchr(base64Arr, c);if (NULL == pIdx){/*找不到对应的base64字符,说明输入的base64字符串有误*/ return -1;}/*返回字符c在base64表中的位置*/return (pIdx - base64Arr);
}   /** @func:  base64_decode
*   @brief: base64解码 
*   @para:  [srcBase64]:要进行解码的原始base64数据
*           [resData]:解码出的结果 
*   @return:none
*/
void base64_decode(const char *srcBase64, unsigned char *resData)
{int i = 0; /*原始base64数据索引*/ int j = 0; /*解码后的结果数据索引*/ int trans[4] = {0,0,0,0}; /*4个base64符号对应的表中的位置(0~63的数字)转换值*/ /*base64符号每4个一组,译码成3个字符*/for (i=0; srcBase64[i]!='\0'; i+=4){/*------译码第1个字符------*//*前2个base64符号在表中的位置(0~63的数字)*/trans[0] = idx_in_base64Arr(srcBase64[i]);trans[1] = idx_in_base64Arr(srcBase64[i+1]);/*第1个符号的后6位,与第2个符号的6、5位,译出第1个字符*/ resData[j++] = ((trans[0] << 2) & 0xfc) | ((trans[1]>>4) & 0x03); /*1111 1100   0000 0011 */ /*------译码第2个字符------*/  /*第3个base64符号是否是=号*/if (srcBase64[i+2] != '='){/*第3个base64符号在表中的位置(0~63的数字)*/trans[2] = idx_in_base64Arr(srcBase64[i + 2]);}else{break;/*没有数据了,break结束*/ }/*第2个符号的后4位,与第3个符号的6、5、4、3位,译出第2个字符*/ resData[j++] = ((trans[1] << 4) & 0xf0) | ((trans[2] >> 2) & 0x0f); /*1111 0000  0000 1111*//*------译码第3个字符------*//*第4个base64符号是否是=号*/if (srcBase64[i + 3] != '='){/*第4个base64符号在表中的位置(0~63的数字)*/trans[3] = idx_in_base64Arr(srcBase64[i + 3]);}else{break;/*没有数据了,break结束*/ }/*第3个符号的后2位,与第4个符号的后6位,译出第3个字符*/ resData[j++] = ((trans[2] << 6) & 0xc0) | (trans[3] & 0x3f); /*1100 0000   0011 1111*/ }/*结束符*/ resData[j] = '\0';
}

测试程序

使用字符串“PCB”进行base64编码测试,然后再将编码得到的结果,进行解码测试。

/*测试*/
int main()
{/*定义要进行base64编码的字符串*/ const unsigned char *srcData = "PCB" ;/*先测试编码*/char base64[128];base64_encode(srcData, base64);  printf("base64编码:%s\n",base64);/*再测试解码*/ char resData[128];base64_decode(base64, (unsigned char*)resData);printf("base64解码:%s", resData);return 0;
}

输出结果如下,可以看出,“PCB”进行base64编码,得到了“UENC”,然后再反向解码,又得到了“PCB”

base64编码:UENC
base64解码:PCB
--------------------------------
Process exited after 0.01123 seconds with return value 0
请按任意键继续. . .

完整程序可从我的gitee仓库下载:
https://gitee.com/xxpcb/c-test/tree/master/C-Base64-Test


http://chatgpt.dhexx.cn/article/yPuApGJH.shtml

相关文章

Base64编码解码原理

本篇文章主要是从Base64的原理入手&#xff0c;并给出java的Base64实现。方便了解、学习Base64。 base64的简介----摘自于百度百科 一、Base64大致用途 很早之前&#xff0c;电子邮件刚刚问世&#xff0c;那时候消息的传递都是英文&#xff0c;后来中国开通了互联网之后&#…

Java—Base64编码原理

Base64作为java编程中常见的编码方式&#xff0c;经常在各种加密&#xff08;例如AES、RSA等等&#xff09;的过程中用来实现加解密中间产物可读性的重要工具&#xff0c;很值得我们去了解一下它的原理。Base64是网络上最常见的用于传输8Bit字节码的编码方式之一&#xff0c;Ba…

一文轻松明白 Base64 编码原理

把图片丢进浏览器&#xff0c;打开sources能看到一长串字符串&#xff0c;这是图片的Base64编码。这一长串编码到底是怎么生成的呢&#xff1f; 我们接下来探索一下base64编码的原理 Base64 名称的由来 Base64编码要求把3个8位的字节&#xff08;3824&#xff09;转化为4个6…

base64编码原理及代码实现

在ctf里reverse经常会有base64相关的题型&#xff0c;每次写到这类题型只能凭经验猜测考点来解题&#xff0c;特此出一个base64相关的博客&#xff0c;加深对base64的理解&#xff0c;下次再看到伪代码也不会觉得慌了&#xff0c;毕竟纵使实现形式不同&#xff0c;代码的核心逻…

Base64编码的原理与常用实现

这篇主要是为了后面好介绍加密算法&#xff0c;做的铺垫。 这个是基础&#xff0c;什么是一个程序员的涵养&#xff0c;这些基础就是涵养。 平时可能用不到&#xff0c;但必须得会。 如果连这个原理都说不上来&#xff0c;就别玩王者荣耀绝地求生英雄联盟和平精英了&#xff0c…

Base64原理及魔改更换码表

一&#xff0c;Base64是什么&#xff08;原理比较难理解&#xff0c;可参考下面的实践 &#xff09; Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64&#xff0c;所以每6个比特为一个单元&#xff0c;对应某个可打印字符。三个字节有24个比特…

base64加密原理解析

开发者对Base64编码肯定很熟悉&#xff0c;是否对它有很清晰的认识就不一定了。实际 上Base64已经简单到不能再简单了&#xff0c;如果对它的理解还是模棱两可实在不应该。大概介绍一下Base64的相关内容&#xff0c;花几分钟时间就可以彻底理解它。文 章下边贴了一个Base64的编…

Base64加密原理

Base64加密方式是将三个八位的字节转化为四个六位的字节&#xff08;不足八位的高位补00&#xff09;&#xff0c;3*8 4*6&#xff1b;&#xff0c;所以base64加密过后的内容比原来的大三分之一&#xff1b; 举例&#xff1a;加密“ace”&#xff0c; ace转化为二进制为&…

Base64编码原理分析

文章目录 一、认识&#xff08;一&#xff09;认识&#xff08;二&#xff09;计算&#xff08;1&#xff09;规则&#xff08;2&#xff09;示例&#xff08;3&#xff09;Base64编码转换表 二、网页图片转base64编码分析&#xff08;一&#xff09;Data URI&#xff08;二&am…

base64编码,原理是什么,有什么作用?

base64到底是什么东西呢&#xff1f; Base64编码是网络上常见的用于传输8bit字节数据的一种编码方式之一 , 有些人和书本会将编码写成加密算法&#xff0c;这其实是欠妥的。因为任何人拿到编码后的数据都能转化成原始数据&#xff0c;算法是透明的&#xff0c;也不存在秘钥的概…

一篇文章彻底掌握Base64编码原理

一篇文章彻底掌握Base64编码原理 在互联网中的每一刻&#xff0c;你可能都在享受着Base64带来的便捷&#xff0c;但对于Base64的基础原理又了解多少&#xff1f;今天这篇博文带领大家了解一下Base64的底层实现。 Base64的由来 目前Base64已经成为网络上常见的传输8Bit字节代…

Base64编码解码原理详解

Base64编码解码原理详解 1. Base64字符的组成部分 Base64所用字符&#xff1a; 0,1,2 ….9 A,B,C,D…Z a,b,c,d…z / 对应ASCII&#xff1a; 48,49…58,65,66…90,97,98…122, 43,47 2. 10个数字&#xff0c;26个大写字母&#xff0c;26个小写字母&#xff0c;1个&#xff0c…

彻底弄懂base64的编码与解码原理

作者介绍 背景 base64的编码原理网上讲解较多&#xff0c;但解码原理讲解较少&#xff0c;并且没有对其中的内部实现原理进行剖析。想要彻底了解base64的编码与解码原理&#xff0c;请耐心看完此文&#xff0c;你一定会有所收获。 涉及算法与逻辑运算概念 在探究base64编码原理…

深入理解 Base64 底层原理

Base64 是一种常见数据编码方式&#xff0c;常用于数据传输。对于移动开发者来讲&#xff0c;网络请求中会经常使用到。对 JSON 熟悉的同学都知道&#xff0c;JSON 的序列化工具都不支持将 byte 数组直接放入 JSON 数据中&#xff0c;针对这种二进制数据&#xff0c;在处理的时…

Base64基本原理

1.什么是Base64 Base64是一种基于64个可打印字符来表示二进制数据的编码方式&#xff0c;是从二进制数据到字符的过程。 原则上&#xff0c;计算机中所有内容都是二进制形式存储的&#xff0c;所以所有内容&#xff08;包括文本、影音、图片等&#xff09;都可以用base64来表示…

一篇文章彻底弄懂Base64编码原理

在互联网中的每一刻&#xff0c;你可能都在享受着Base64带来的便捷&#xff0c;但对于Base64的基础原理又了解多少&#xff1f;今天这篇博文带领大家了解一下Base64的底层实现。 Base64的由来 目前Base64已经成为网络上常见的传输8Bit字节代码的编码方式之一。在做支付系统时&…

Base64编码原理

一、Base64是什么 base 64、base 32、base 16 编码建议标准 https://www.ietf.org/rfc/rfc4648.txt Base64是基于64种字符的编码算法&#xff0c;即将数据使用64种字符表示&#xff0c;编码后的Base64字符串长度 通常为原来的3-4倍。&#xff08;补充&#xff1a;Base32就是…

Base64原理

前言 Base64是什么?它和加解密操作有什么关系吗?我们看一下下边这段字符串: aGVsbG8gd29ybGQ= 这就是经过Base64编码后的字符串,对它进行Base64解码,获得它原来的内容: hello world 这有点加密解密的意味,不过Base64并不能称为加密算法,仅仅是加密算法的近亲,可以称之…

Base64原理解析

一. Base64编码由来 为什么会有Base64编码呢&#xff1f;因为有些网络传送渠道并不支持所有的字节&#xff0c;例如传统的邮件只支持可见字符的传送&#xff0c;像ASCII码的控制字符就 不能通过邮件传送。这样用途就受到了很大的限制&#xff0c;比如图片二进制流的每个字节不可…

base64加密原理详解

Base64编码&#xff0c;是我们程序开发中经常使用到的编码方法。它是一种基于用64个可打印字符来表示二进制数据的表示方法。它通常用作存储、传输一些二进制数据编码方法&#xff01;也是MIME&#xff08;多用途互联网邮件扩展&#xff0c;主要用作电子邮件标准&#xff09;中…