问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

base64的简介

发布网友 发布时间:2022-05-18 01:30

我来回答

1个回答

热心网友 时间:2023-10-03 05:33

标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。
为解决此问题,可采用一种用于URL的改进Base64编码,它在末尾填充'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“*”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。
此外还有一些变种,它们将“+/”改为“_-”或“._”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name)。
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。 关于这个编码的规则:
①.把3个字符变成4个字符。
②每76个字符加一个换行符。
③.最后的结束符也要处理。 转换前 11111111, 11111111, 11111111 (二进制)
转换后 00111111, 00111111, 00111111, 00111111 (二进制)
上面的三个字节是原文,下面的四个字节是转换后的Base64编码,其前两位均为0。
转换后,我们用一个码表来得到我们想要的字符串(也就是最终的Base64编码),这个表是这样的:(摘自RFC2045)
转换表
Table 1: The Base64 Alphabet 索引 对应字符 索引 对应字符 索引 对应字符 索引 对应字符 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 + 12 M 29 d 46 u 63 / 13 N 30 e 47 v   14 O 31 f 48 w   15 P 32 g 49 x   16 Q 33 h 50 y    转换前 10101101,10111010,01110110
转换后 00101011, 00011011 ,00101001 ,00110110
十进制 43 27 41 54
对应码表中的值 r b p 2
所以上面的24位编码,编码后的Base64值为 rbp2
解码同理,把 rbq2 的二进制位连接上再重组得到三个8位值,得出原码。
(解码只是编码的逆过程,有关MIME的RFC还有很多,如果需要详细情况请自行查找。)
第一个字节,根据源字节的第一个字节处理。
规则:源第一字节右移两位,去掉低2位,高2位补零。
既:00 + 高6位
第二个字节,根据源字节的第一个字节和第二个字节联合处理。
规则如下,第一个字节高6位去掉然后左移四位,第二个字节右移四位
即:源第一字节低2位 + 源第2字节高4位
第三个字节,根据源字节的第二个字节和第三个字节联合处理,
规则第二个字节去掉高4位并左移两位(得高6位),第三个字节右移6位并去掉高6位(得低2位),相加即可
第四个字节,规则,源第三字节去掉高2位即可
//用更接近于编程的思维来说,编码的过程是这样的:
//第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一//个目标字符。
//然后将第一个字符与0x03(00000011)进行与(&)操作并左移4位,接着第二个字符右移4位与前者相或(|),即获得第二个目标字符。
//再将第二个字符与0x0f(00001111)进行与(&)操作并左移2位,接着第三个字符右移6位与前者相或(|),获得第三个目标字符。
//最后将第三个字符与0x3f(00111111)进行与(&)操作即获得第四个目标字符。
//在以上的每一个步骤之后,再把结果与 0x3F 进行 AND 位操作,就可以得到编码后的字符了。
可是等等……聪明的你可能会问到,原文的字节数量应该是3的倍数啊,如果这个条件不能满足的话,那该怎么办呢?
我们的解决办法是这样的:原文剩余的字节根据编码规则继续单独转(1变2,2变3;不够的位数用0补全),再用=号补满4个字节。这就是为什么有些Base64编码会以一个或两个等号结束的原因,但等号最多只有两个。因为:
一个原字节至少会变成两个目标字节
所以余数任何情况下都只可能是0,1,2这三个数中的一个。如果余数是0的话,就表示原文字节数正好是3的倍数(最理想的情况)。如果是1的话,转成2个Base64编码字符,为了让Base64编码是4的倍数,就要补2个等号;同理,如果是2的话,就要补1个等号。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
怎么追求单亲家庭的女孩子 怎么追一个单亲家庭的女孩子 为什么英雄联盟闪退 求帮助谢谢? win7电脑开lol就崩win764位系统为什么我的电脑一玩lol就闪退 windows7LOL win7闪退怎么办 选完区后闪退解决办法 win7英雄联盟为什么闪退_win7英雄联盟闪退解决办法 微信收款码刚寄过来还没激活,微信就被同行举报封掉了,收款二维码还有用... 平行四边形的面积公式用字母表示是__ win7电源设置在哪里 win7电源设置怎么设置 伤心英语单词是什么 0.111将该数的补码左移2个数 创意生日礼物送女生 C++ 二进制转8进制 进制问题啊 ip的进制问题 无符号二进制整数10101101等于十进制数( ),等于十六进制数( ),等于八进制数( ) 二进制数10101101转换成其他进制的数,正确的有( )多选。 已知八位机器码10101101(最高位为符号位),当它是原码、反码、补码时表示的十进制真值分别是什么? 如何画两组人口数据比较的漏斗图 如何把我的文件夹里得照片存到手机相册?或者怎麼在电脑QQ找到? 有些网页的文字不让人复制,该怎么把上面的文字粘贴到word啊??? 嚼东西的时候耳心痛是怎么回事? 跨区变更地址周期需要多久? 特殊符号告诉点啊! 关于电灯莫名其妙自己 亮的原因 家里灯为什么无缘无故炸了 家里的按键电灯开关自己开了,能用科学解释吗?还是闹鬼? 家里所有的房间灯为啥自己亮了? 家里的灯突然关了又亮了怎么回事 这个特殊符号怎么打《〈 3个小于符号? 合在一起 穿越火线巛符号怎么打 歌曲如何下载到音乐列表里 Origin锁屏如何设置展示应用或快捷工具? 什么牌子的笔记本触摸板比较好 fckeditor中从word复制过来的文字不能保存在数据库中 非限购a股市值是什么意思 记得,但密码忘记了,登录不上该怎么办呢? 忘记密码怎么登录? 中国科学院大学培训中心颁发的碳排放管理师怎么样?下期什么时候考试? 忘记密码怎么登录? 被盗了还改了密码怎么办? 我的微信被别人登了密码都改了怎么办? 微信零钱密码被别人改了怎么办? 我的微信被别人登了密码都改了怎么办? 小米3手机里有自带隐私空间吗 !!急!悬赏100分如何把textarea变成ewebeditor或者是fckeditor 小米手机有和华为一样的隐私空间吗 我已有多年无嗅觉感是怎么回事? 我的鼻子无嗅觉,都半年多点了 嗅觉完全消失的原因 注册会计师已经交费可以改科目吗