这篇文章主要介绍“base64编码原理是什么”,在日常操作中,相信很多人在base64编码原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”base64编码原理是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!base64 是网络传输 8Bit 字节代码的编码方式之一,是一种基于 64 个可打印字符来表示二进制数据的方法。在做支付系统时,报文交互都需要使用 base64 对明文进行转码,然后再进行签名或加密,之后再进行(或再次 base64 转码)传输。那么,base64 到底起到什么作用呢?在参数传输的过程中经常遇到的一种情况:使用全英文的字符串没问题,但一旦涉及到中文就会出现乱码的情况。与此类似,网络上传输的字符并不全是可打印的字符,比如二进制文件、图片等。base64 的出现就是为了解决此问题,它是基于 64 个可打印的字符来表示二进制的数据的一种方法。电子邮件刚问世的时候,只能传输英文,但后来随着用户的增加,中文、日韩俄文等文字的用户也有需求,但这些字符并不能被服务器或网关有效处理,因此 base64 就登场了。随后,base64 在 URL、Cookie、网页传输少量二进制文件中也有相应的使用。基于a-z
、A-Z
、0-9
、+/
这 64 个字符来标识二进制数据,另外=
符号用于当字节缺位时补用。base64 编码对照表索引对应字符索引对应字符索引对应字符索引对应字符0A17R34i51z1B18S35j5202C19T36k5313D20U37l5424E21V38m5535F22W39n5646G23X40o5757H24Y41p5868I25Z42q5979J26a43r60810K27b44s61911L28c45t62+12M29d46u63/13N30e47v14O31f48w15P32g49x16Q33h50ybase64 要求把每三个 8Bit
的字节转换
为四个 6Bit
的字节(3*8 = 4*6 = 24
),然后把 6Bit再添两位高位 0
,组成四个 8Bit 的字节(4*8=32
)。为什么使用 3 个字节一组呢?因为 6 和 8 的最小公倍数
为 24,三个字节正好 24 个二进制位,每 6 个 bit 位一组,恰好能够分为 4 组。同时用于分组后每组添加两个高位 0,转换后
的字符串理论上
将要比原来的字符长 1/3(24/32=1/3)
。步骤分解:将待转换的字符串每三个字符分为一组,每个字符字节占 8bit,那么共有 24 个二进制位。将 24 个二进制位每 6 个字节为一组,共分为 4 组。在每组 6 字节前面添加两个 0,每组由 6 字节变为 8 字节二进制位,组成总共 32 个二进制位,即四个字节。根据 base64 编码对照表获得对应的值。举个栗子LJY
对应的 ASCII 码值分别为 76、74、89,对应的二进制值是 01001100、01001010、01011001。由此组成一个 24 位的二进制位字符串。将 24 位的二进制位字符串,按照每 6 位二进制位一组分成 4 组。对 4 组 每组 6 位二进制位字符串前面补两个 0,每组扩展为 8 位二进制位,4 组共扩展成 32 个二进制位,此时 4 组二进制位分别为:00010011、00000100、00101001、00011001。其对应的 base64 编码索引为:19、4、41、25。用 base64 编码索引值在 base64 编码表中进行查找,分别对应:T、E、p、Z。因此LJY
base64 编码之后就变为:TEpZ。以标准 3 个字符LJY
为例。字符位数不足情况上述栗子是面向刚好三个字符为一组的情况。当然不是免费云主机域名所有时候都这么巧字符位数足够,除此以外有位数不足的情况。那么,面对字符位数不足的情况下该如何处理呢?base64 给出的方案是,当每组字符不足三位时,不足位数位置需要使用=
符号补上。位数不足情况处理情景:位数缺一个字节:一个字节共 8 个二进制位,依旧按照规则进行分组。此时共 8 个二进制位,每 6 个一组,则第二组缺少 4 位,用 0 补齐,得到两个 base64 编码,而后面两组没有对应数据,都用=
补上。位数缺两个字节:两个字节共 16 个二进制位,依旧按照规则进行分组。此时总共 16 个二进制位,每 6 个一组,则第三组缺少 2 位,用 0 补齐,得到三个 base64 编码,第四组完全没有数据则用=
补上。位数不足图解如下:列举了一个字符到三个字符转换为 base64 ,可以发现将 base64 就是按照 base64 编码对照表来将二进制转换为字符串,使得数据不能直接明文展示出来,但也算不上是加密,而这巧好可用在传输、存储、表示二进制领域的情景。另外值得注意的是,不用语言如中文有多种编码(比如:utf-8、gb2312、gbk 等),不同编码对应 base64 编码结果都不一样。其次在推演过程中可发现 base64 即用 6 位字节(2 的 6 次幂就是 64)表示字符同理,Base32 就是用 5 位字节,Base16 就是用 4 位字节。大家可以按照上面的步骤进行演化测试。知道 base64 是什么后,也该到为什么出现了。为什么要是使用 base64 呢,这要从其优缺点入手来选择适合场景了。优势:base64 适合不同平台、不同语言的传输;页面中内嵌使用 base64 格式的小图片,可减少了服务器访问次数;二进制位转换 base64 算法简单,对性能影响不大;缺点在基于 Android6.0 及以下默认浏览器实测场景中发现,某些机型如中兴上传 base64 图片会因为字符大小过大导致上传奔溃的情况。字符长度过大的 base64 不适应使用在 URL 情景,因为 IOS 端浏览器会限制 URL 长度,当长度超过时会自动切除多余部分,导致数据丢失。base64 字符过大会导致页面加载速度变慢,因此建议 10kb 以下的图片使用。二进制文件转换为 base64 后,体积大概增加 1/3;base64 无法缓存,要缓存只能缓存包含 base64 的文件,比如 js 或者 css;面对大文件时,会消耗一定的 CPU 进行编解码atob(encodedData) : 解码一个 base64 编码的字符串。enCodedData,是一个通过 btoa() 方法编码的字符串, 为二进制字符串包含 base64 编码的数据。并返回包含来自 encodedData 的解码数据的 ASCII 字符串。btoa(stringToEncode) : 创建一个 bas64 编码的字符串。stringToEncode 为要编码的二进制字符串。并返回包含 stringToEncode 的 base64 表示形式的 ASCII 字符串。另外在 JavaScript 中,字符串使用 UTF-16 字符编码表示:在这种编码中,字符串表示为 16 位(2 字节)单元的序列。每个 ASCII 字符都可以放入其中一个单元的第一个字节,但许多其他字符不能。base64 在设计上需要二进制数据作为其输入。就 JavaScript 字符串而言,这意味着每个字符只占用一个字节的字符串。因此,如果将一个字符串传递到 btoa()中,其中包含占用多个字节的字符,则会出现错误,因为这不被视为二进制数据,因此超 16 位字符在使用 btoa()时需要先对字符转码为二进制位。兼容性:atob() 方法不支持 IE9 及更早的 IE 版本。到此,关于“base64编码原理是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!
本篇内容介绍了“Java怎么用堆解决Top-k问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!堆其实就是一种二叉树,但是普通的二叉树是以链式结构进行储存数据的…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。