当前位置:  编程技术>.net/c#/asp.net

Base64编码解码原理及C#编程实例

    来源: 互联网  发布时间:2014-11-04

    本文导语:  一. Base64编码由来 为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就不能通过邮件传送。这样用途就受到了很大的限制,比如图片二进制流的...

一. 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"的编码过程也是一样的。

三.编程实现(C#)

编码:

代码如下:

byte[] bytes=Encoding.Default.GetBytes("要转换的字符串");
Convert.ToBase64String(bytes);

解码:
代码如下:

byte[] outputb = Convert.FromBase64String("ztKwrsTj");
string orgStr= Encoding.Default.GetString(outputb);

    
 
 

您可能感兴趣的文章:

  • C# Base64编码函数
  • c# Base64编码和图片的互相转换代码
  • c# Base64编码函数学习笔记
  • c# Base关键字的使用
  • c#访问this关键字和base关键字示例
  • c#中this关键字与base关键字使用方法
  • C# 参考之访问关键字:base、this
  • Base64编码原理详解及c++编码解码实现
  • 弱弱的问一下如何用openssl进行base64编码和解码的代码实现
  • BASE64编码解码库 libb64
  • 各种格式的编码解码工具类分享(hex解码 base64编码)
  • PHP安全的URL字符串base64编码和解码
  • 在java里有关编码和解码的问题:比如对中文编码成BASE64或quoted-printable或者是其他的,应该用什么类什么方法?请赐教!!
  • 请问将BASE64编码字串解码?
  • c++base64编解码使用示例
  • PHP base64编码后解码乱码的解决办法
  • 在java中如何对base64字符串进行解码,请指教!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • python中的hashlib和base64加密模块使用实例
  • java命名空间javax.xml.crypto.dsig接口transform的类成员方法: base64定义及介绍
  • 为什么[-n "$LS_BASE_NAME" -a -z "${LS_BASE_NAME}.${group_name}.x" ]提示不合法?
  • java命名空间javax.swing.text.html.parser类dtd的类成员方法: base定义及介绍
  • 搭建snort安装BASE后出现问题?????????
  • java命名空间java.awt.font接口opentype的类成员方法: tag_base定义及介绍
  • 请问有没有办法判断一串字符串是否经过base64编码
  • java命名空间javax.swing.text.html类html.tag的类成员方法: base定义及介绍
  • Java Base64
  • java命名空间java.io接口objectstreamconstants的类成员方法: tc_base定义及介绍
  • 简洁实用的Java Base64编码加密异常处理类代码
  • HTML 5 <base> 标签-规定页面中所有链接的基准 url
  • 关于TEXT_BASE的定义
  • HTML <base> 标签
  • python获得图片base64编码示例
  • C语言的BASE64处理 b64
  • 二进制转BASE64问题,急
  • 请教:我把word.doc文档以bin.base64类型方式形成一个xml,上传到服务器后,如何在servlet中,读取这个流。。。
  • 全注解的SSH框架 ssh-base-framework
  • base href 使用方法详解
  • php base64加密解密的实现代码
  • 菜鸟问题:在linux下,c语言编写程序,要连接openoffice.org base作为数据库!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3