关于Base64

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

转自:http://www.cnblogs.com/luguo3000/p/3940197.html

最近一段时间分析apk,发现有个base64,以为是一种加密方式,同同事谈起,原来是一种编码方式,甚为羞愧,于是google百度之,才明白其原理。引用此文章以铭记。


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

  一. Base64编码由来

  为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就不能通过邮件传送。这样用途就受到了很大的限制,比如图片二进制流的每个字节不可能全部是可见字符,所以就传送不了。最好的方法就是在不改变传统协议的情况下,做一种扩展方案来支持二进制文件的传送。把不可打印的字符也能用可打印字符来表示,问题就解决了。Base64编码应运而生,Base64就是一种基于64个可打印字符来表示二进制数据的表示方法。

  二. Base64编码原理

  看一下Base64的索引表,字符选用了"A-Z、a-z、0-9、+、/" 64个可打印字符。数值代表字符的索引,这个是标准Base64协议规定的,不能更改。64个字符用6个bit位就可以全部表示,一个字节有8个bit位,剩下两个bit就浪费掉了,这样就不得不牺牲一部分空间了。这里需要弄明白的就是一个Base64字符是8个bit,但是有效部分只有右边的6个bit,左边两个永远是0。

  那么怎么用6个有效bit来表示传统字符的8个bit呢?8和6的最小公倍数是24,也就是说3个传统字节可以由4个Base64字符来表示,保证有效位数是一样的,这样就多了1/3的字节数来弥补Base64只有6个有效bit的不足。你也可以说用两个Base64字符也能表示一个传统字符,但是采用最小公倍数的方案其实是最减少浪费的。结合下边的图比较容易理解。Man是三个字符,一共24个有效bit,只好用4个Base64字符来凑齐24个有效位。红框表示的是对应的Base64,6个有效位转化成相应的索引值再对应Base64字符表,查出"Man"对应的Base64字符是"TWFU"。说到这里有个原则不知道你发现了没有,要转换成Base64的最小单位就是三个字节,对一个字符串来说每次都是三个字节三个字节的转换,对应的是Base64的四个字节。这个搞清楚了其实就差不多了。

         

  但是转换到最后你发现不够三个字节了怎么办呢?愿望终于实现了,我们可以用两个Base64来表示一个字符或用三个Base64表示两个字符,像下图的A对应的第二个Base64的二进制位只有两个,把后边的四个补0就是了。所以A对应的Base64字符就是QQ。上边已经说过了,原则是Base64字符的最小单位是四个字符一组,那这才两个字符,后边补两个"="吧。其实不用"="也不耽误解码,之所以用"=",可能是考虑到多段编码后的Base64字符串拼起来也不会引起混淆。由此可见Base64字符串只可能最后出现一个或两个"=",中间是不可能出现"="的。下图中字符"BC"的编码过程也是一样的。

  三. 总结  

  说起Base64编码可能有些奇怪,因为大多数的编码都是由字符转化成二进制的过程,而从二进制转成字符的过程称为解码。而Base64的概念就恰好反了,由二进制转到字符称为编码,由字符到二进制称为解码。

  Base64编码主要用在传输、存储、表示二进制等领域,还可以用来加密,但是这种加密比较简单,只是一眼看上去不知道什么内容罢了,当然也可以对Base64的字符序列进行定制来进行加密。

  Base64编码是从二进制到字符的过程,像一些中文字符用不同的编码转为二进制时,产生的二进制是不一样的,所以最终产生的Base64字符也不一样。例如"上网"对应utf-8格式的Base64编码是"5LiK572R",对应GB2312格式的Base64编码是"yc/N+A=="。


Base64详解 Base64编码是一种简单而强大的工具,广泛应用于数据传输和存储中。通过本文的介绍,读者可以理解Base64编码的原理、实现步骤以及如何在Java中使用Base64编码和解码。希望本文能帮助读者更好地掌握这一技术,并在实际开发中灵活运用。版权声明:本博客内容为原创,转载请保留原文链接及作者信息。参考文章BASE64 编码解析与实例-优快云博客base64算法详解 - 六月瓜 - 博客园。 阅读详情

相关推荐

图片转base64 与base64转图片 与输出日志

图片转base64(注意:转换后的字符串需要加上"data:image/png;base64," 才能被识别)// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理public static String GetImageStr(String imagePath) { InputStream in = null; byte[] data = null; // 读取图片字节数组 try...

J_Qu_Jing的博客 4663

base64编码解码

base64编码解码

火红色祥云 4万+

bee go用base64Captcha生成base64的验证码

废话不多说 直接 上代码: login.go package controllers import ( "fmt" "strings" "github.com/astaxie/beego" "github.com/mojocn/base64Captcha" ) var store = base64Captcha.DefaultMemStore /* var store base64Captcha.Store func init() { store = base64Captcha.Defa

dz45693的专栏 1857

Base64加密解密

Base64加密解密。

听海的博客 8916

Base64编码解码

Base64 是一种常用的编码方式,用于将二进制数据转换为可打印的 ASCII 字符串。它的主要特点如下:1. 字符集:Base64 使用了 64 个字符来表示数据,包括大小写字母(A-Z, a-z)、数字(0-9)以及两个特殊字符(+ 和 /)。2. 填充字符:Base64 编码后的字符串长度通常不会与原始数据长度完全对齐。为了保持长度整齐,Base64 在末尾添加一个或两个 `=` 号作为填充字符。3. 编码方式:Base64 编码将每 3 个字节作为一组,转换为 4 个 Base64 字符。

新时代农民工 5800

C#解码Java生成的Base64字符串

最近在开发过程中经常遇到C# 客户端调用java开发的服务端程序,这次遇到的坑是C# 中的`Convert.FromBase64String(dummyData)`解密不了java返回的base64字符串

星火燎猿 3340

什么是Base64,以及在Java中使用Base64编码

Base64是一种用64个字符(0-9,a-z,A-Z,+,/)来表示二进制数据的方法,是基于64个可打印字符进行编码的。Base是一种索引编码,每6个bit位作为一个单元,对应一个字符,为了保证所输出的编码为可读字符,Base64制定了一个编码表,以便进行统一转换,编码表的大小为2^6=64,这也是Base64名称的由来。

优快云_YYD_997的博客 4467

【工具使用】Keil常用的调试操作整理介绍

2、当选择了非0级优化时,调试可能会变得困难,具体表现在断点调试。该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的置。:如果是在C语言窗口中,则是按单条语句执行,与单步调试不同的是,遇到函数不会进入函数内部,而是直接全速运行函数,并跳到下一条语句。但我的Keil软件中无法显示这个视图,并且通过修改系统试图,调试时,点击打开系统视图发生了闪退的现象,目前能想到的原因是:重新安装Keil,安装最新版本。

MEYOU_Cc 不吃香菜! 1万+

C++ Base64转图片&&图片转Base64

Base64的由来 目前Base64已经成为网络上常见的传输8Bit字节代码的编码方式之一。在做支付系统时,系统之间的报文交互都需要使用Base64对明文进行转码,然后再进行签名或加密,之后再进行(或再次Base64)传输。那么,Base64到底起到什么作用呢? 在参数传输的过程中经常遇到的一种情况:使用全英文的没问题,但一旦涉及到中文就会出现乱码情况。与此类似,网络上传输的字符并不全是可打印的字...

my_angle2016的博客 1万+

ComfyUI-controlnet控制出图

提供加载预处理器节点。

Bu2n的博客 5493

(超详细)互补格雷码+相移码求解包裹相位(Python实现)

记录实现“互补格雷码+相移码”求解包裹相位的编码过程。也可以叫它“5+4”法,5代表五幅格雷码图像,4代表四步相移法的四张正弦条纹图。

暴雨梨花博客 3万+

字符串转base64,base64转字符串

【JavaScript原生提供两个Base64相关方法】 btoa():字符串或二进制值转为Base64编码 atob():Base64编码转为原来的编码 备注:利用这两个原生方法,我们来封装一下,标题需求 【使用函数方式】 var str = '元仙僧'; console.log(encode(str));//JUU2JTgwJUFBJUU4JUFGJTlFJUU1JTkyJTk2JUU1JT...

元仙僧的博客 1万+

Android Audio常见问题分析方法

分析audio dump,确定写给BT的data是否正常,MTK平台Android原生架构分析threadloop write节点,高通平台分析QXDM 1586节点,从dump确定问题大概位置。分析systrace 确定性能。AudioFocus状态(用于播放或者音量异常的情况)。AudioTrack是否正常创建bt连接是否正常通路异常,setMode,setSpeakerphoneOn等都会影响设备选择,sco调用流程是否正常。

一条老狗的博客 2387

Base64 编码与解码:URL Base64、MIME Base64

Java 8 中 Base 64 java 8 在标准API中增加Base64功能,通过 java.util.Base64工具类: Java 8 基本 Base64 输入任意字符串,输出被映射到“A-Za-z0-9+/”字符集中(没有回车符、换行符),解密从该字符集中解析为任意字符: // 编码 String asB64 = Base64.getEncoder().encodeToString("some string".getBytes("utf-8")); System.out.pri...

抓娃攻城师 4270

使用 Mid360 从零开始搭建实物机器人入门级导航系统 —— 基于 Fast_Lio 和 Move_Base

本文详细介绍了如何使用Mid360机器人从零开始搭建一个基于Fast_Lio和Move_Base的入门级导航系统。通过配置 ROS2、集成激光雷达、IMU、Fast_Lio、Move_Base 等模块,我们成功构建了一个能够实现自动导航的机器人系统。在实际开发中,随着需求的变化,你可以不断调整参数、优化路径规划算法、增加新的传感器等,逐步提升机器人的智能与功能。

小蜗牛的珍贵百宝箱 3563

手把手教你用 Cursor 写一个完整的 Web 应用(含前后端 + 部署)

本文介绍如何利用Cursor AI工具从零开发一个完整的全栈待办事项Web应用。文章针对开发者常见痛点——无法独立完成项目闭环,提供了一套AI驱动的全栈开发范式。通过Vue3+Node.js+MySQL技术栈,全程由Cursor自动生成项目架构、前后端代码、数据库设计,并解决联调、部署等关键问题。重点展示了如何用AI完成:项目规划与架构设计、后端接口开发、前端页面实现、跨域联调、打包优化及云端部署全流程。该方法将传统需要3-5天的开发工作压缩至1小时内完成,产出规范可上线的项目,特别适合想突破"碎

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 632

【Qt】【Base64】 Base64简单介绍和Qt下Base64编解码

什么是Base64: 参考: Base64编解码及其C++实现 什么是Base64? “Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法”。 Base64,就是使用64个可打印字符来表示二进制数据的方法。 我:简单的来说就是把二进制的数据,按每6位(2的6次方=64)读取再转换为可打印字符(64个,且...

weitaming1的博客 2514

【YOLO26实战全攻略】19——智慧交通(一):高速抛洒物与事故检测全流程落地

在智慧交通领域,高速公路抛洒物、交通事故等突发状况常导致二次事故与大规模拥堵,传统人工监控存在响应滞后、覆盖有限等痛点。本文基于Ultralytics YOLO26算法,结合ByteTrack多目标跟踪技术,构建从数据准备、模型训练到边缘部署的全栈式智慧交通检测系统。核心内容包括:多车型专属数据集构建、抛洒物检测模型优化、ByteTrack轨迹跟踪集成、异常事件(违停/逆行/碰撞)识别逻辑实现,以及NVIDIA Jetson边缘设备部署方案。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1487

Base64和Base64URL

转自:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001399413803339f4bbda5c01fc479cbea98b1387390748000 Base64是一种用64个字符来表示任意二进制数据的方法。 用记事本打开exe、jpg、pdf这些文件时,我们都会看到一...

磨镜台的博客 2万+

12、多端神经形态晶体管:原理、应用与算法探索

本文综述了多端神经形态晶体管的原理、应用与算法探索。从神经元MOS晶体管的发展到基于电解质栅极晶体管(EGT)的新型器件设计,系统阐述了其在低电压、多功能逻辑运算和突触行为模拟方面的优势。重点介绍了其在化学生物传感器(如多巴胺和pH检测)中的高灵敏度应用,以及在树突整合、时空总和、动态逻辑和神经元算术等树突算法中的实现。文章还总结了该类器件在神经形态计算、智能传感等领域的广阔前景,并分析了当前面临的材料工艺、理论建模与系统集成挑战,展望了未来发展方向。

delta的博客 143

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Openresty base64编码

OpenResty目前内建支持的有Base64和JSON两种格式,下面我们介绍base64. Base64格式使用64个字符,可以把任意数据转换为ASCII码可见字符串,应用得非常普遍。OpenResty使用ngx.encode_base64和ngx.decode_base64这两个函数实现了标准的Base64编码和解码: local str = "1234" local enc = ngx.encode_base64(str) -- 编码为“ MTizNA==” local dec= ngx

赶路人儿 4633

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

base64

综上,浏览器对 Base64 图片的处理是 “自动解码 + 格式解析 + 渲染” 的过程,开发者只需正确提供 Data URI 格式即可。)识别数据格式,调用对应的图片解码器(如 PNG 解码器)处理二进制数据,最终将其渲染为可视的图片。,它将二进制数据(如图片、文件)转换为由 64 个可打印字符(A-Z、a-z、0-9、解码得到二进制数据后,浏览器根据 MIME 类型(如。,将其还原为原始的二进制数据(如图片的像素数据)。补全长度(确保编码后长度为 4 的倍数)。)组成的字符串,末尾可能用。

bug_caicai的博客 2996

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Base64Utils java 常用Base64编码解码工具类

package com.mycode.util; import java.nio.charset.Charset; import org.apache.commons.codec.binary.Base64; /** Base64 工具类 @author lz */ public class Base64Utils { private static final Charset DEFAUL...

weixin_40256979的博客 3648

base64编码_Base64编码详解

来源 | 公众号 架构师必备Base64编码原理Base64编码之所以称为Base64,是因为其使用64个字符来对任意数据进行编码,同理有Base32、Base16编码。标准Base64编码使用的64个字符为:这64个字符是各种字符编码(比如ASCII编码)所使用字符的子集,基本,并且可打印。唯一有点特殊的是最后两个字符,因对最后两个字符的选择不同,Base64编码又有很多变种,...

weixin_39621185的博客 2180

base64 url safe

1: 为什么需要base64? ASCII码一共规定了128个字符的编码,这128个符号,范围在[0,127]之间. 其中,[0,31],及127, 33个属于不可打印的控制字符. 在电子邮件传输信息时,有些邮件网关会把[0,31]这些控制字符给悄悄清除. 还有的早期程序,收到[128,255]之间的国际字符时,甚至会发生错误. 如何在不同邮件网关之间安全的传输控制字符,国际字符,甚至二进制文件? 于是作为MIME多媒体电子邮件标准的一部分—base64被开发出来. 1.a 什么是url_safe

dw5235的博客 4797

mysql base64_MySQL中的base64编码

MySQL中的base64编码我想从一个表中选择一个blob col,base64对其进行编码,然后将其插入到另一个表中。 有什么方法可以在不将数据往返数据库和通过我的应用程序往返的情况下进行此操作?BCS asked 2020-07-27T05:31:08Z8个解决方案50 votes我一直在寻找相同的东西,但我刚刚看到MySQL 5.6有两个支持此功能的新字符串函数:TO_BASE64和FRO...

weixin_34312809的博客 1872
上一篇: unity 第三人称
下一篇: AndroidStudio导入项目一直卡在Building gradle project info最快速解决方案
骑行的蜗牛
博客等级 码龄21年 107粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值