Base64编解码原理

C++ Base64编解码原理与实现:从位运算到工程实践 Base64编码是一种将二进制数据转换为ASCII可打印字符的编码方案,其核心原理是将每3个字节(24位)的二进制数据重新划分为4个6位单元,每个单元映射到一个由64个字符(A-Z, a-z, 0-9, +, / 或变体)组成的查找表中。这种编码解决了二进制数据在纯文本协议(如HTTP、SMTP)中传输时可能出现的乱码或截断问题,确保了数据的安全可靠传输。在工程实践中,Base64常用于网络数据传输、配置文件存储、数据轻度混淆等场景,例如在CTF竞赛中处理编码挑战或实现轻量级、无外部依赖的数据转换模块。理解 阅读详情

Base64编解码原理

Base64可以将ASCII字符串或者是二进制编码成只含A--Z,a--z,0--9,+,/ 这64个字符(这也是为啥叫Base64的原因).
 
1. 编码原理:将3个字符转换成4个字符( (3 X 8) = 24 字节= (4 X 6) )
   取输入流中的3个字节,每次取6位(共4次),以此6位值做索引去查表,输出相应的字符。如果输入流中字符不是3的倍数,最后结果缺的就以"="填充(输入流中最后只剩1个字符就填2个=;剩2个就填1个=).
base64digits[] =   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

           
2. 解码原理:将4个字符转换成3个字符.
            先读入输入流中的4个字符,然后根据上表中的值找索引(也可根据如下程序中的base64val[]索引查找),生成4个6位的值,然后以字节(8位)截断,就形成3个字符的ASCII值,这样就还原了.

C语言中是通过移位>> <<和按位&|实现的。
下面程序是网上的列子(有一个不正确的地方,偶稍微修改下了,并 加了测试)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <ctype.h>
 
 static const char base64digits[] =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
 #define BAD -1
 static const char base64val[] = {
     BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD,
     BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD,
     BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD, 62, BAD,BAD,BAD, 63,
      52, 53, 54, 55, 56, 57, 58, 59, 60, 61,BAD,BAD, BAD,BAD,BAD,BAD,
     BAD, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
      15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,BAD, BAD,BAD,BAD,BAD,
     BAD, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
      41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,BAD, BAD,BAD,BAD,BAD
 };
 #define DECODE64(c) (isascii(c) ? base64val[c] : BAD)
 
 void to64frombits(unsigned char *out, const unsigned char *in, int inlen)
 {
         for (; inlen >= 3; inlen -= 3)
         {
                 *out++ = base64digits[in[0] >> 2];
                 *out++ = base64digits[((in[0] << 4) & 0x30) | (in[1] >> 4)];
                 *out++ = base64digits[((in[1] << 2) & 0x3c) | (in[2] >> 6)];
                 *out++ = base64digits[in[2] & 0x3f];
                 in += 3;
         }
 
         if (inlen > 0)
         {
                 unsigned char fragment;
 
                 *out++ = base64digits[in[0] >> 2];
                 fragment = (in[0] << 4) & 0x30;
 
                 if (inlen > 1)
                         fragment |= in[1] >> 4;
 
                 *out++ = base64digits[fragment];
                 *out++ = (inlen < 2) ? '=' : base64digits[(in[1] << 2) & 0x3c];
                 *out++ = '=';
         }
         
         *out = '/0';
 }
 
 int from64tobits(char *out, const char *in)
 {
         int len = 0;
         register unsigned char digit1, digit2, digit3, digit4;
 
         if (in[0] == '+' && in[1] == ' ')
                 in += 2;
         if (*in == '/r')
                 return(0);
 
         do {
                 digit1 = in[0];
                 if (DECODE64(digit1) == BAD)
                         return(-1);
                 digit2 = in[1];
                 if (DECODE64(digit2) == BAD)
                         return(-1);
                 digit3 = in[2];
                 if (digit3 != '=' && DECODE64(digit3) == BAD)
                         return(-1);
                 digit4 = in[3];
                 if (digit4 != '=' && DECODE64(digit4) == BAD)
                         return(-1);
                 in += 4;
                 *out++ = (DECODE64(digit1) << 2) | (DECODE64(digit2) >> 4);
                 ++len;
                 if (digit3 != '=')
                 {
                         *out++ = ((DECODE64(digit2) << 4) & 0xf0) | (DECODE64(digit3) >> 2);
                         ++len;
                         if (digit4 != '=')
                         {
                                 *out++ = ((DECODE64(digit3) << 6) & 0xc0) | DECODE64(digit4);
                                 ++len;
                         }
                 }
         } while (*in && *in != '/r' && digit4 != '=');
        //don't forget this line!

         *out='/0';
 
         return (len);
 }

int main()
{

char in[]="linewer",*out,out2[8];
int inlen=strlen(in),n;

n=(inlen % 3)?(inlen/3+1)*4 : (inlen/3*4);
out=malloc(n+1);


to64frombits(out,in,inlen);
printf("%s/n",in);
printf("%s/n",out);
from64tobits(out2,out);
printf("%s/n",out2);

free(out);
}

Base64 编解码原理及源码解析 Base64的实现原理** 1)将给定的字符串转换成对应的字符编码(如:GBK、UTF-8)   2)将获得该字符编码转换成二进制码   3)对获得的二进制码进行分组操作   第一步:每3个字节(8位二进制)为一组,一共24个二进制位   第二步:将这个24个二进制位分成4组,每个组有6个二进制位,不足6位的,后面补0。   第三步:在每个组前面加两个0,这样每个组就又变成了8位,即每个组一个字节,4个组就4个字节了。 第四步:根据Base64的转码表找到每个字节对应的符号,这个符号就是Base64的编码值 阅读详情

相关推荐

命令行Base64编解码实战:从原理到自动化脚本集成

Base64编码是一种将二进制数据转换为ASCII字符的编码方案,其核心原理是将每3个字节(24位)的二进制数据映射为4个可打印字符,以确保数据在仅支持文本的通道(如电子邮件、URL参数)中安全传输。理解其编码原理有助于排查数据传输和存储中的兼容性问题。在技术价值上,命令行工具提供了对数据处理流程的完全控制,是实现自动化、保障数据隐私和提升批量处理效率的关键。在应用场景中,运维人员常需在服务器环境中直接处理API响应、配置文件或日志中的编码数据,而开发者在构建CI/CD流水线或处理嵌入式系统数据时,也离不开

csdndownload11123的博客 374

算法系列8《Base64》

目录(?)[-] Base64索引表C实现代码 Base64hCBase64cpp         Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,Base64编码可用于在HTTP环境下传递较长的标识信息。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,即所编码的数

Lyu-ming 栏目 565

VC++实现Base64编解码:原理、优化与实战应用

Base64编码是一种将二进制数据转换为ASCII字符的编码方案,其核心原理是将每3个字节(24位)的数据重新分组为4个6位的单元,每个单元映射为一个可打印字符。这种编码方式确保了数据在仅支持文本传输的通道(如HTTP、XML、JSON)中安全可靠地流通,避免了因特殊字符引发的解析错误。从技术价值看,Base64不仅解决了二进制数据文本化传输的通用性问题,还因其算法透明、实现轻量,成为深入理解位操作、内存管理与数据编码的经典案例。在应用场景上,无论是网络通信中的数据封装、配置文件中的密钥存储,还是Web开发

weixin_28452161的博客 303

java和c语言base64编码区别,C语言base64编码与解码

#include #include #include #define BAD -1#define INVALID_ARG -1#define WRONG_FORMAT -2#define OUTPUT_OVERFLOW -3static const char base64digits[] = // characters used for base64 code"ABCDEFGHIJKLMNOPQR...

weixin_39744512的博客 248

C++详解Base64编解码原理以及Base64编解码接口实现(附源码)

本文详细讲述Base64编码相关的内容,以及Base64编解码的代码实现。 1、Base64编码帮我们解决的实际问题 我们在使用libjingle(客户端)和XMPP服务器实现IM聊天功能时,测试过程中发现,当发送信息的包含一些特殊字符(不可识别字符)时,XMPP服务器会强行将客户端断开。起初很是奇怪,为啥随便发几个消息后,XMPP服务器就将libjing...

dvlinker的技术专栏 5397

详解Base64编解码原理以及Base64编解码接口实现(附源码)

详解Base64编解码原理以及Base64编解码接口实现(附源码)

dvlinker的技术专栏 212

C语言base64编码与解码

昨天工作中遇到需要将char *转换成base64的问题,把这块单独提取出来作为一个模块。 这里有几个参数需要解释一下: char *out:一块buffer的首地址,这块buffer就是用来存放我们转码后的内容的。当然要注意提前malloc内存。 char *in:原字符串的首地址,指向需要转码的内容,即原字符串内容。 int inlen:原字符串长度。 int maxlen:可支持的转

superbfly的专栏 1万+

8B10B编码详解.pdf

在高速的串行数据传输中,传送的数据被编码成自同步的数据流,就是将数据和时钟组 合成单一的信号进行传送,使得接收方能容易准确地将数据和时钟分离,而且要达到令人满 意的误码率,其关键技术在于串行传输中数据的编码方法。8B10B 作为互连接口的一种编码 技术,设计简单、性能出众,因此成为应用最广泛的技术。然而,它的系统开销高达25%, 问题突出。为了解决这个问题,设计者们一直在探寻改进的方法。本文就将介绍8B10B 码 的编码原理及实现方法,并介绍了一些低开销的编码技术,讨论它们的优势与存在的问题。

Base64算法原理

Base64算法将输入的字符串或一段数据编码成只含有{A-Z, a-z, 0-9, +, /}这64个字符的串,=用于填充。其编码的方法是,将输入数据流每次取6 bit,用此6 bit的值(0-63)作为索引去查表,输出相应字符。这样,每3个字节将编码为4个字符(3×8 → 4×6);不满4个字符的以=填充。编

angus_du的专栏 1146

高通410随身WiFi刷OpenWRT与Debian双系统一键集成方案

本文详细介绍高通410随身WiFi设备刷入OpenWRT与Debian双系统的一键集成方案。通过虎王工作室提供的一键刷机包,用户可轻松实现双系统部署,兼顾OpenWRT的网络功能与Debian的完整应用服务,适用于网络加速、服务器部署等多种场景,并提供了硬件资源分配与系统切换的实用指南。

docker7nomad的博客 1138

保姆级教程:Halcon 3D点云匹配与差异分析避坑指南(从采样到可视化)

本文提供了一份详细的Halcon 3D点云匹配与差异分析实战指南,涵盖从模型准备到可视化的全流程。重点解析了STL文件读取单位误区、点云采样密度优化、表面模型创建技巧以及差异分析的专业手法,帮助用户避开常见陷阱,提升工业检测效率与精度。

weixin_33728268的博客 402

详解8B10B编码(高速收发器五)

8B10B编码是IBM在1983年提出的高速传输编码标准,用于解决时钟恢复和直流偏移问题。它将8位数据编码为10位,通过3B4B和5B6B编码规则实现,保证数据变化,利于时钟恢复。编码包括12个控制字符K码,用于同步和控制。编码过程简单,通过查表法实现,但存在数据损耗问题。

详解FPGA及硬件电路开发 7633

Python+gensim【中文LDA】简洁模型

文章目录完整代码过程详解words_lsdictionarydictionary.doc2bow函数corpuslda 完整代码 from gensim import corpora, models import jieba.posseg as jp # 待分析文本集 text1 = '美国教练坦言,没输给中国女排,是输给了郎平' text2 = '中国女排世界排名第一?真实水平如何,听听巴西和美...

ArYe 2万+

解码base64_(基础篇 04) C++ base64 编解码原理及实现

Base64原理Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。由于 2^6 = 64,所以每 6 个比特为一个单元,对应某个可打印字符。3 个字节有 24 个比特,对应于 4 个 Base64 单元,即 3 个字节可由 4 个可打印字符来表示。它可用来作为电子邮件的传输编码。在 Base64 中的可打印字符包括字母 A-Z、a-z、数字 0-9 和 +, /。Base64...

weixin_39676242的博客 134

灰度重心法实战:从原理到MATLAB代码实现激光条纹中心线提取

本文详细介绍了激光条纹中心线提取的核心方法——灰度重心法。通过物理类比阐释其原理,并提供从图像预处理到MATLAB代码实现的完整实战教程。文章重点解析了算法流程、关键参数调整及常见问题避坑指南,帮助读者快速掌握这一机器视觉与三维测量中的基础且高效的技术。

cake8的博客 462

WinForm布局

登录模板页面UILoginForm

m0_71541781的博客 470

base64编解码原理及实现

原理参照:BASE64编码简介 一、概念及原理: BASE64是一种编码方式,通常用于把二进制数据编码为可写的字符形式的数据。这是一种可逆的编码方式。编码后的数据是一个字符串,其中包含的字符为:A-Z、a-z、0-9、+、/ 共64个字符(26 + 26 + 10 + 1 + 1 = 64)【注:其实是65个字符,“=”是填充字符】。 64个字符需要6位来表示,表示成数值为0~63。 这样,长度...

火焰 1419

网神 SecGate 3600 防火墙 app_av_import_save文件上传漏洞(含批量验证poc)

网神 SecGate 3600 防火墙 app_av_import_save文件上传漏洞(含批量验证poc)

weixin_43567873的博客 297

Base64编解码原理并用Java手工实现Base64编解码

Base64编解码原理 目前Base64已经成为网络上常见的传输8比特字节代码的编码方式之一。在做支付系统时,系统之间的报文交互都需要使用Base64对明文进行转码,然后进行签名或加密,之后再次Base64编码传输。那么,Base64到底起到什么作用呢? 在参数传输的过程中经常遇到的一种情况:使用全英文的没问题,但一旦涉及到中文就会出现乱码情况。与此类似,网络上传输的字符并不全是可打印的字符,比如二进制文件、图片等。Base64的出现就是为了解决此问题,它是基于64个可打印的字符来表示二进制的数据的一种方法

学无止境! 1533

机器人中的数值优化(二十一)—— 伴随灵敏度分析、线性方程组求解器的分类和特点、优化软件

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例

慕羽★的博客 4205

Golang内存管理:GC调优实战案例

在Golang编程中,内存管理是一个非常重要的方面。良好的内存管理可以提高程序的性能和稳定性,而GC(垃圾回收)调优则是优化内存管理的关键手段。本文的目的就是通过实际案例,深入讲解Golang中GC调优的方法和技巧,让读者能够在实际项目中更好地进行内存管理和性能优化。范围涵盖了从核心概念的解释到具体代码实现和调优过程的详细分析。本文首先会介绍一些相关的术语和核心概念,让读者对Golang内存管理和GC有一个基本的认识。然后通过故事引入的方式,更加形象地解释核心概念及其相互关系。

AI Agent Harness Engineering 1118

Dart中Base64编解码原理与实践指南

Base64编码是一种将二进制数据转换为ASCII字符串的编码方式,广泛应用于数据传输与存储场景。其核心原理是将3个8位字节转换为4个6位字节,再映射到64个可打印字符。这种编码技术特别适合在文本协议中传输二进制数据,如在HTTP请求、JSON格式或URL参数中嵌入文件内容。Dart语言通过dart:convert库原生支持Base64编解码,包括标准Base64和URL安全变体。在实际工程中,开发者需要注意字符编码处理、大文件分块编码等性能优化技巧,以及Flutter应用中图片与API交互等典型应用场景。

weixin_34072296的博客 293

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

base64原理及其编解码的python实现

base64原理及其编解码的python实现base64base64简介base64编码表base64编码原理base64编解码的python实现其他base编码base16base32base36、base58、 base62、 base85、base91、 base92 base64 base64简介 base64是一种基于64个可打印字符来表示二进制数据的表示方法。26=64,所以每6bit为一个单元,对应某个可打印字符。3字节有24bit,对应4个base64单元,即3字节任意二进制数据可由4个可打

P1umH0的博客 1512

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Base64 在线编码/解码工具 以及 Base64 编解码原理

写了个自己的 Base64 在线编码/解码工具。没广告,爽歪歪!https://tool.gcc.ac.cn/zh/base64.html

叶梓翎的备忘录 2069

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

BASE64编解码原理

将数据编码成BASE64编码时,以3字节数据为一组,转换为24bit的二进制数,将24bit的二进制数分成四组,每组6bit。对于每一组,得到一个数字:0-63。然后根据这个数字查表即得到结果。 Value Encoding Value Encoding Value Encoding Value Encoding 0 A 17 R 34 i 51 z 1 B 18 S...

danielzhou1025的博客 230
上一篇: Emacs常用命令速查
下一篇: IP地址漂移技术[转]
Garyhou
博客等级 码龄20年 41粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值