BASE64编码规则及C#实现
一、编码规则
Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。这时在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个“=”。
例:将对ABC进行BASE64编码
首先取ABC对应的ASCII码值。A(65)B(66)C(67)。
再取二进制值A(01000001)B(01000010)C(01000011),然后把这三个字节的二进制码接起来(010000010100001001000011),再以6位为单位分成4个数据块并在最高位填充两个0后形成4个字节的编码后的值(00010000)(00010100)(00001001)(00000011)。蓝色部分为真实数据。再把这四个字节数据转化成10进制数得(16)(20)(19)(3)。最后根据BASE64给出的64个基本字符表,查出对应的ASCII码字符(Q)(U)(J)(D)。这里的值实际就是数据在字符表中的索引。
注BASE64字符表:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
二、解码规则
解码过程就是把4个字节再还原成3个字节再根据不同的数据形式把字节数组重新整理成数据。
三、实现代码:
using System;
using System.IO;
using System.Data;
namespace Base64{
internal class Base64{
public static string Base64Code(string Message)
{
char[] Base64Code=new char[]{A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,
U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,
o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,
8,9,+,/,=};
byte empty=(byte)0;
System.Collections.ArrayList byteMessage=new System.Collections.ArrayList(System.Text.Encoding.Default.GetBytes(Message));
System.Text.StringBuilder outmessage;
int messageLen=byteMessage.Count;
int page=messageLen/3;
int use=0;
if((use=messageLen%3)>0)
{
for(int i=0;i<3-use;i++)
byteMessage.Add(empty);
page++;
}
outmessage=new System.Text.StringBuilder(page*4);
for(int i=0;i<page;i++)
{
byte[] instr = new byte[3];
instr[0]=(byte)byteMessage[i*3];
instr[1]=(byte)byteMessage[i*3+1];
instr[2]=(byte)byteMessage[i*3+2];
int[] outstr=new int[4];
outstr[0]=instr[0]>>2;
outstr[1]=((instr[0]&0x03)<<4)^(instr[1]>>4);
if(!instr[1].Equals(empty))
outstr[2]=((instr[1]&0x0f)<<2)^(instr[2]>>6);
else
outstr[2]=64;
if(!instr[2].Equals(empty))
outstr[3]=(instr[2]&0x3f);
else
outstr[3]=64;
outmessage.Append(Base64Code[outstr[0]]);
outmessage.Append(Base64Code[outstr[1]]);
outmessage.Append(Base64Code[outstr[2]]);
outmessage.Append(Base64Code[outstr[3]]);
}
return outmessage.ToString();
}
public static string Base64Decode(string Message){
if((Message.Length%4)!=0){
throw new ArgumentException("不是正确的BASE64编码,请检查。","Message");
}
if(!System.Text.RegularExpressions.Regex.IsMatch(Message,"^[A-Z0-9/+=]*$",System.Text.RegularExpressions.RegexOptions.IgnoreCase)){
throw new ArgumentException("包含不正确的BASE64编码,请检查。","Message");
}
string Base64Code="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
int page=Message.Length/4;
System.Collections.ArrayList outMessage=new System.Collections.ArrayList(page*3);
char[] message=Message.ToCharArray();
for(int i=0;i<page;i++)
{
byte[] instr=new byte[4];
instr[0]=(byte)Base64Code.IndexOf(message[i*4]);
instr[1]=(byte)Base64Code.IndexOf(message[i*4+1]);
instr[2]=(byte)Base64Code.IndexOf(message[i*4+2]);
instr[3]=(byte)Base64Code.IndexOf(message[i*4+3]);
byte[] outstr=new byte[3];
outstr[0]=(byte)((instr[0]<<2)^((instr[1]&0x30)>>4));
if(instr[2]!=64)
{
outstr[1]=(byte)((instr[1]<<4)^((instr[2]&0x3c)>>2));
}
else
{
outstr[2]=0;
}
if(instr[3]!=64)
{
outstr[2]=(byte)((instr[2]<<6)^instr[3]);
}
else
{
outstr[2]=0;
}
outMessage.Add(outstr[0]);
if(outstr[1]!=0)
outMessage.Add(outstr[1]);
if(outstr[2]!=0)
outMessage.Add(outstr[2]);
}
byte[] outbyte=(byte[])outMessage.ToArray(Type.GetType("System.Byte"));
return System.Text.Encoding.Default.GetString(outbyte);
}
}
}
BASE64编码规则及C#实现的更多相关文章
- url、base64 编码规则
UrlEncode 相关: URI所允许的字符分作保留与未保留. 保留字符是那些具有特殊含义的字符. 例如, 斜线字符用于URL (或者更一般的, URI)不同部分的分界符. 未保留字符没有这些特殊含 ...
- 计算机编码规则之:Base64编码
目录 简介 Base64和它的编码原理 Base64的变体 Base64的编码细节 总结 简介 我们知道计算机中的文件可以分为两种,一种是人肉眼可读的文本类文件,一种是肉眼不可读的二进制文件.一般来说 ...
- Base64编码
Base64编码 写在前面 今天在做一个Android app时遇到了一个问题:Android端采用ASE对称加密的数据在JavaWeb(jre1.8.0_7)后台解密时,居然解密失败了!经过测试后发 ...
- 【前端攻略】:玩转图片Base64编码
引言 图片处理在前端工作中可谓占据了很重要的一壁江山.而图片的 base64 编码可能相对一些人而言比较陌生,本文不是从纯技术的角度去讨论图片的 base64 编码.标题略大,不过只是希望通过一些浅显 ...
- 图片Base64编码
我们经常在做Jquery插件的时候需要插入一些自定义的控件,比如说按钮,而我们自己又觉着button标签很丑,而且不同浏览器显示的效果还不一样,这个时候我们需要用到图片,当然,我们可以通过img标签添 ...
- Base64编码原理分析
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在了解Base64编码之前,先了解几个基本概念:位.字节. 位:"位(bit)"是计算机中最小的数据单位.每一位 ...
- 【字符编码】字符编码 && Base64编码算法
一.前言 在前面的解决乱码的一文中,只找到了解决办法,但是没有为什么,说白了,就是对编码还是不是太熟悉,编码问题是一个很简单的问题,计算机从业人员应该也必须弄清楚,基于编码的应用有Base64加密算法 ...
- c# base64 编码解码
一. Base64的编码规则 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编 码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24 位数据,再把这24位数 ...
- Base64编码简介
基本概念 Base64这个术语最初是在“MIME内容传输编码规范”中提出的.Base64不是一种加密算法,虽然编码后的字符串看起来有点加密的赶脚.它实际上是一种“二进制到文本”的编码方法,它能 ...
随机推荐
- Javaweb学习笔记--分层设计
在早期的JavaWeb应用中,JSP文件负责处理业务逻辑,控制网页流程并创建HTML页面,JSP文件是一个独立的,能自主完成所有任务的模块, 这带来了一系列问题:HTML代码和Java程序代码强耦合在 ...
- 如何从零开始实现一个soa远程调用服务基础组件
说起soa远程调用基础组件,最著名的莫过于淘宝的dubbo了,目前很多的大型互联网公司都有一套自己的远程服务调用分布式框架,或者是使用开源的(例如dubbo),或者是自己基于某种协议(例如hessia ...
- [DP] LGTB 玩THD (复杂状态DP)
LGTB 玩THD LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻 ...
- 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...
- iOS 分类思想(2)
/******************* NSString+NumCount.h文件 ******************************/ #import <Foundation/Fo ...
- html标签对应的英文原文
标签 对应英文 说明 <!--> / 注释 <!DOCTYPE> document type 文档类型 <a> anchor 超链接 <abbr> ab ...
- LPC17XX 数据手册摘要之系统时钟与功率控制
系统时钟与功率控制 一.系统时钟 LPC17XX有三个独立的时钟振荡器,分别是主振荡器(MIAN_OSC).内部RC振荡器(IRC_OSC).实时时钟振荡器(RTC_OSC).LPC17XX时钟框图如 ...
- linux安装mysql出现Could NOT find Curses (missing CURSES_LIBRARY CURSES_INCLUDE_PATH),提示解决方法
[root@localhost mysql-5.5.11]# cmake . 出现以下错误提示: -- Could NOT find Curses (missing: CURSES_LIBRARY ...
- Python设计模式——工厂方法模式(FactoryMethod)
需求:有一个学雷锋活动,有买米和扫地两个内容,参与的人有大学生和社区志愿者,他们各自的方法不一样. 如果用简单工厂模式实现: #encoding=utf-8 __author__ = 'kevinlu ...
- unity3d游戏开发(一)——圈圈叉叉
参考:http://game.ceeger.com/forum/read.php?tid=1719 ———————————————————开始————————————— 好吧,吹了那么多我们开始吧,先 ...