base64编码与解码

今天考试,给出了base64编码的规则,需要编写一个程序实现base64解码(对于字符串中有中文或者其它多字节字符的,要注意他们的编码,比如对于中文字符,使用的是UTF8而不是GB2312,这一点在最后面有说明)。
base64编码规则概述:
在密码学领域里,非常多的加密想法极有创意,base64便是其中一种。虽然规则简单,但值得仔细品味欣赏。关于base64编码的细节和应用,网上能搜索到很多资料。
base64编码就是把原文对应的二进制串换一种方法解释。我们知道,一个字节是8个bit,把一个二进制串按6个bit一组来解释,就是base64编码。由于6个bit共有2^6=64个不同的二进制串,把这64个不同的二进制串再映射为64个ASCII字符, 这样,base64编码就把任何的二进制输入流转变成了一串ASCII字符串。这被映射的64个ASCII字符依次为:’A’-‘Z’, ‘a’-‘z’, ‘0’-‘9’, ‘+’, ‘/’。假设编码前的数据是x个字节,编码后的ASCII字符串是y个字节,很明显有 3*x = 4*y。
比如我们要给大写字母’A’进行base64编码,大写字母A为0x41,二进制形式是01000001,按6个bit一组来解释,前6个bit是010000,还剩下两个bit 01,不够6个,所以给它补上四个0,凑成6个,所以得到010000   010000,010000的值是16,在映射表里’A’是0,’B’是1……,第16个是’Q’,所以010000 010000映射成ASCII字符串就是QQ,因为A是一个字节,还差两个字节才能凑够3个,所以需要填充两个’=’,这样,大写字母A的base64编码就是QQ==。同样,如果对”AB”编码,则结果是:QUI=。
 
一个关于base64编码和解码的在线测试的网站是:
http://www.21softs.com/b64endecode.htm

 
这里说说我在测试我的程序的时候的一些问题:
想到了如果程序中有汉字,那么如何,于是我使用“测试”这两个汉字在网站上编码,结果是:5rWL6K+V,我使用我的程序对这个结果进行解码,得到的解码后的结果竟然不是“测试”这两个汉字。
但是我用自己写的base64编码程序对任何字符串进行编码,然后使用自己写的解码程序对编码后的结果进行解码,解码的结果与编码前的字符串完全一致!这说明程序逻辑没有问题,那么,原因只可能是字符编码不同。
“测试”两个汉字用我的程序编码,结果是:suLK1A==,一个汉字两个字节,所以“测试”为四个字节,编码后应该有两个=填充,符合逻辑。然而在在线测试网站上,“测试”的base64编码是:5rWL6K+V,没有任何填充字符,说明在线测试网站上的“测试”两个字不是四个字节,根据3*x=4*y的公式,应该是恰好6个字节,一个汉字三个字节。这让我想到了UTF8编码。
所以,把“测试”两个字先从GB2312转到UTF8,在UTF8下的“测试”的二进制是:0xe6, 0xb5, 0x8b, 0xe8, 0xaf, 0x95,再用自己的程序对这六个字节进行base64编码,得到的结果也是:5rWL6K+V。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值