base64编码与解码
2008-12-19 11:07
134 查看
今天考试,给出了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。
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。
相关文章推荐
- base64编码与解码(单字节,asp)
- java 中使用base64编码和解码
- BASE64编码与解码(Base64Encode,Base64Decode)
- 实用命令:利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密
- java base64编码和解码
- 用C#实现Base64处理,加密解密,编码解码
- Base64 算法原理,以及编码、解码【加密、解密】 介绍
- 用Base64编码与解码
- Base64编码和解码
- c# base64 编码解码
- Base64 编码解码
- Base64编码解码
- BASE64 编码和解码
- 使用GTMBase64编码解码字符串
- Base64 编码解码C++实现
- C#中Base64之编码,解码方法
- Base64编码及解码程序源代码
- BASE64编码与解码
- C#实现Base64编码与解码及编码名称和代码页(Encoding.GetEncoding)
- JavaScript Base64编码和解码,实现URL参数传递。