【ESP32 在线语音】Base64编码的科普

news/2025/10/28 1:36:29/文章来源:https://www.cnblogs.com/FBsharl/p/19170529

一、Base64的编码规则

Base64编码的核心目标是将二进制数据转换成由64个可打印ASCII字符组成的文本

这64个字符是:

  • 26个大写字母: A-Z

  • 26个小写字母: a-z

  • 10个数字: 0-9

  • 2个符号: + 和 /

  • 填充符: = (用于末尾填充,不属于64个字符之内)

编码步骤如下:

  1. 将数据按字节分组: 将输入的二进制数据每3个字节(24个比特) 分为一组。3个字节是编码的基本单位。

  2. 将24个比特划分为4个6比特单元: 24 ÷ 6 = 4,所以每一组3字节的数据会被重新划分为4个6比特的单元。

  3. 将6比特单元转换为对应字符: 每个6比特的值(范围是0-63)根据上面的Base64索引表,找到对应的可打印字符。

    • 例如: 000000 -> A000001 -> B, ... 111101 -> 9111110 -> +111111 -> /

  4. 处理末尾不足的情况

    • 如果最后剩下的数据只有2个字节(16比特),我们会在末尾补一个0字节(8个0),使其成为24比特。然后按正常流程划分为4个6比特单元,但最后一个单元因为是由补的0构成的,所以对应的字符是=。最终输出为3个Base64字符 + 1个=

    • 如果最后剩下的数据只有1个字节(8比特),我们会在末尾补两个0字节(16个0),使其成为24比特。然后划分为4个6比特单元,最后两个单元都是补的0,所以对应的字符都是=。最终输出为2个Base64字符 + 2个=

举个例子(文本“Man”):

 
 
步骤 内容 说明
原始数据 M a n 三个ASCII字符
ASCII码(二进制) 01001101 01100001 01101110 共24比特
重新分组(6比特) 010011 010110 000101 101110 分为4组
十进制 19 22 5 46 6比特的值
Base64编码 T W F u 查表:19->T, 22->W, 5->F, 46->u

所以,“Man”的Base64编码是 TWFu

二、为什么使用Base64编码?

最主要的原因是:为了在仅支持文本的环境下安全地传输或存储二进制数据。

  1. 兼容性(首要原因)
    许多古老的协议(如SMTP用于电子邮件)和系统是为传输纯文本(ASCII)而设计的。它们会特定地解释一些控制字符,例如:

    • NUL (0x00): 字符串结束符。

    • LF (0x0A): 换行符。

    • CR (0x0D): 回车符。
      如果二进制数据中包含了这些控制字符,就会导致传输中断、数据被修改或解析错误。Base64将所有数据转换为纯ASCII文本,完美避开了这些问题。

  2. 数据安全
    虽然Base64不是加密(它没有密钥,任何人都可以解码),但它可以起到一种“模糊”作用,防止数据被“一眼看穿”。例如,在URL中传递简单的二进制标识,或者在某些场景下避免敏感数据因包含特殊字符而被误处理。

  3. 统一数据表示
    它提供了一种将任何二进制数据(如图片、zip文件、公钥证书)表示为字符串的标准方法,方便在JSON、XML等文本格式中嵌入。

三、什么情况使用Base64编码?

以下是一些非常常见的应用场景:

  1. 电子邮件附件(MIME): 这是Base64最早也是最经典的应用。通过MIME协议,将图片、文档等二进制附件编码成文本,随邮件正文一起发送。

  2. 在HTML中嵌入小图片(Data URL): 将图片转换成Base64字符串,直接写在HTML的 <img src="data:image/png;base64,..."> 标签中,可以减少HTTP请求。

  3. JSON / XML中传输二进制数据: 例如,Web API返回的用户头像、服务器生成的PDF文件等,都可以用Base64编码后放入JSON字段中。

  4. URL和Cookie: 有时需要在URL参数或Cookie中存储一些二进制信息,使用Base64编码可以避免特殊字符(如&=%)引起的问题。不过需要注意,Base64中的+/在URL中也是特殊字符,所以有专门的URL安全的Base64变种(用-_替代)。

  5. 存储加密或哈希结果: 加密或哈希函数(如MD5, SHA)的输出是二进制数据,通常以Base64形式存储和展示,比直接显示十六进制更紧凑。

四、维持原来的编码不好吗?

这个问题很好,答案是:在特定场景下,维持原来的编码确实“不好”,甚至是“行不通”的。

  • 对于纯文本数据: 如果你要传输的数据本身就是纯ASCII文本(比如“Hello World”),那么再对它进行Base64编码是多此一举的。它不仅会使数据体积增大约33%(3字节变4字节),还增加了编码解码的计算开销。在这种情况下,维持原来的编码是最好的

  • 对于二进制数据: 这正是Base64要解决的核心问题。维持二进制原始编码,在文本协议中传输是行不通的。原因如下:

    • 数据损坏: 如前所述,文本协议会解释控制字符,导致二进制流被截断或修改。

    • 字符集问题: 二进制数据可能包含非ASCII字符,在不同的字符集编码下(如UTF-8, GBK)可能会产生乱码,而Base64是纯粹的ASCII,不存在字符集兼容问题。

总结:

 
 
场景 建议 理由
在文本协议(如SMTP)中传输二进制文件 必须使用Base64 避免控制字符干扰,保证数据完整性。
在JSON/XML中嵌入二进制数据(如图片) 推荐使用Base64 文本格式兼容性好,标准化。
传输或存储纯文本数据 不要使用Base64 增加不必要的开销,保持原样即可。
需要加密安全 不要依赖Base64 Base64不是加密,需使用专业的加密算法(如AES)。

Base64是一个典型的 “权衡” 工具:它用增加约33%的数据体积额外的编码/解码计算为代价,换来了在纯文本环境下的通用性、安全性和可靠性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/948217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GroundingDino针对航空图像检测的改进 MM Grounding Dino Large - MKT

GroundingDino针对航空图像检测的改进 MM Grounding Dino Largehttps://arxiv.org/abs/2401.02361 测试数据集构建 针对无人机航拍特性,构建包含以下场景的测试集:城市航拍:建筑物、车辆、行人(分辨率38402160)…

看了个介绍音频相关的视频有感,44100HZ 就是母带

世界是连续的,而电子设备只知道0和1,手机外放低频就听不到了,而你可以听到蝙蝠煽动翅膀,而所谓的无损、高帧率也只是一秒内的数据样多一些,更能骗过大脑而已,所以我们活着的每一天都是奇迹,尤其几千年文明,从9…

GroundingDino目标跟踪+sam2分割 - MKT

GroundingDino目标跟踪+sam2分割说明 1 sam2的代码文件依赖是相对于sam2工程的,所以在sam2下面构建 2 需要训练空中数据集 3 不能直接全直接sam2分割,分割的会很混乱安装 环境 rtx 3070 ubuntu20 cuda11.8 python3…

人工智能十大数学知识 - 群论 - 何苦

人工智能十大数学知识 - 群论群论(Group Theory)在人工智能中的核心应用群论是研究代数结构“群”的数学分支,核心是描述对称性与变换不变性,在AI中主要用于挖掘数据或模型的对称结构、简化复杂计算、优化模型泛化…

人工智能十大数学知识 - 数理逻辑 - 何苦

人工智能十大数学知识 - 数理逻辑数理逻辑(Mathematical Logic)在人工智能中的核心应用 数理逻辑是研究“推理与证明”的数学分支,为AI提供知识表示、逻辑推理、不确定性处理的底层框架。从专家系统的规则库到知识图…

人工智能十大数学知识 - 复杂性理论 - 何苦

人工智能十大数学知识 - 复杂性理论人工智能中的计算复杂性理论(Computational Complexity Theory)相关知识计算复杂性理论是AI中“问题难度评估”的核心框架,研究求解问题所需的资源消耗(时间、空间)与问题固有难…

人工智能十大数学知识 - 离散数学 - 何苦

人工智能十大数学知识 - 离散数学离散数学(Discrete Mathematics)在人工智能中的核心应用 离散数学是研究离散结构(如命题、集合、图、序列)的数学分支,是AI处理结构化知识、逻辑推理、离散数据建模的基础。从专家…

【解决方法】通过windows远程桌面连接centos stream10_基于xrdp(网上搜出来的路径里找不到startwm.sh)

【解决方法】通过windows远程桌面连接centos stream10_基于xrdp(网上搜出来的路径里找不到startwm.sh)安装epel yum install epel-release 安装xrdp 由于centos stream10太新,yum源里面没有适配此系统的xrdp,尝试通过…

人工智能十大数学知识 - 图论 - 何苦

人工智能十大数学知识 - 图论图论(Graph Theory)在人工智能中的核心应用 图论是描述“对象关联关系”的数学工具,通过顶点(实体) 和边(关系) 构建离散结构,是AI处理非欧几里得数据(如社交网络、知识图谱、分子…

人工智能十大数学知识 - 优化理论 - 何苦

人工智能十大数学知识 - 优化理论人工智能中的优化理论核心知识(Optimization Theory for AI) 优化理论是AI模型训练的“引擎”,核心是通过数学方法找到使目标函数(如损失函数)达到极值的参数取值。从线性回归的闭…

人工智能十大数学知识 - 信息论 - 何苦

人工智能十大数学知识 - 信息论信息论(Information Theory)在人工智能中的核心应用 信息论是量化“信息不确定性”与“分布差异”的数学工具,为AI模型的损失设计(如交叉熵)、特征选择(如互信息)、生成式模型(如…

人工智能十大数学知识 - 概率与统计学 - 何苦

人工智能十大数学知识 - 概率与统计学人工智能中的概率与统计学核心知识(Probability and Statistics for AI)概率与统计学是AI量化不确定性、从数据中学习规律的核心工具——从模型参数估计(如线性回归权重)到生成…

在服务器上直接从百度网盘下载文件

使用bypy bypy 本质上是单线程下载,它获取一个普通的下载链接然后像浏览器一样去下载,下载速度可能很慢。 1.下载bypy conda install bypy2.认证并授权网盘账号 bypy info3.将所需文件转移至目的文件夹下 授权成功后…

25.10.27

25.10.27从今天起 记录一下学习历程... 因为觉得最近很没计划,可能学了两个月有点累了... 但是还远没结束,后面还有更难的任务。 明天: 刷完 bfs 和 PriorityQuery 的题 Redis 八股收尾 快速学微服务 正式戒烟第一天…

251028

251028我分析过三个躁郁症患者,发现他们对自己的了解都很深入,我不知道是了解自己太多会导致躁郁还是躁郁症导致的,两者必有联系

刷题日记—链表—快慢指针的应用

今天刷链表类的题目,碰到了几个快慢指针的题目: 1.删除倒数第k个节点: 题目: 这个题目没有给size,所以无法遍历,这时候就要借助快慢指针. 代码如下: class Solution { public:int kthToLast(ListNode* head, in…

【SHADER系列】(四)UGUI 渐变/平滑遮罩 SoftMask

todo 参考:mob-sakai/SoftMaskForUGUI: Enhance Unity UI (uGUI) with advanced soft-masking features to create more visually appealing effects!

newDay16

1.今天课比较多,晚上主要是把自己东西都收拾了一遍,太乱了 2.明天尽量学学,课也不少 3.这数据库是真连不明白

【ESP32 在线语音】讯飞星火语音识别功能(听写流式API)文档阅读

接口要求 集成语音听写流式API时,需按照以下要求。内容 说明请求协议 ws[s](为提高安全性,强烈推荐wss)请求地址中英文(推荐使用):ws[s]: //iat-api.xfyun.cn/v2/iat中英文:ws[s]: //ws-api.xfyun.cn/v2/iat (上…