自己写的编码类

New919 2006-08-10 03:11:22
using System;
using System.Text;
using System.Collections;
using Shaka.Common;
namespace Shaka.Encrypt.Mine
{
/// <summary>
///
/// </summary>
public class myBase64
{
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','+','/','='};
public myBase64()
{
}

#region Base64编码
/// <summary>
/// Base64编码
/// </summary>
/// <param name="pStrSrc"></param>
/// <returns></returns>
public string Base64Encoder(string pStrSrc)
{
// 编码规则
// Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。
// 它将需要编码的数据拆分成字节数组。以3个字节为一组。
// 按顺序排列24位数据,再把这24位数据分成4组,即每组6位。
// 再在每组的的最高位前补两个0凑足一个字节。
// 这样就把一个3字节为一组的数据重新编码成了4个字节。
// 当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。
// 这时在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个“=”。

ArrayList arrList = new ArrayList(Encoding.Default.GetBytes(pStrSrc));
string strBinaryString = "";
int iLoopCount = 0;
string strRetureValue = "";
int iEqualNum = 0;

#region 补 零
switch(arrList.Count % 3)
{
case 1 :
{
arrList.Add(0);
arrList.Add(0);
iEqualNum = 2;
break;
}
case 2:
{
arrList.Add(0);
iEqualNum = 1;
break;
}
default : break;
}
#endregion

// 转化成二进制形式的字符串
for(int i = 0 ; i < arrList.Count ; i ++)
{
strBinaryString += Number.ToBinary(Convert.ToInt32(arrList[i]));
}
// 确定循环次数
iLoopCount = strBinaryString.Length / 6;
for(int i = 0 ; i < iLoopCount ; i ++)
{
int[] iBase64 = new int[iLoopCount];
strRetureValue += Base64Code[Number.ToInt((strBinaryString.Substring(i * 6 , 6)))];
}
// 加等号
if(iEqualNum == 1)
{
strRetureValue = strRetureValue.Remove(strRetureValue.Length - 1 , 1);
strRetureValue = strRetureValue.Insert(strRetureValue.Length , "=");
}
else if(iEqualNum == 2)
{
strRetureValue = strRetureValue.Remove(strRetureValue.Length - 2 , 2);
strRetureValue = strRetureValue.Insert(strRetureValue.Length , "=");
strRetureValue = strRetureValue.Insert(strRetureValue.Length , "=");
}
return strRetureValue;
}
#endregion

#region Base64解码
/// <summary>
/// Base64解码
/// </summary>
/// <param name="pStrBase64String"></param>
/// <returns></returns>
public string Base64Decoder(string pStrBase64String)
{
#region 编码过程演示
// 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','+','/','='};
// abcd
// 011000 010110 001001 100011 011001 000000 000000 000000
// 00011000 00010110 00001001 00100011 00011001 00000000 00000000 00000000
// 24 22 9 35 25 0 0 0
// Y W J j Z A A A
// YWJjZAAA
// YWJjZA
// YWJjZA==
#endregion

#region 解码过程推理
// 检查密文尾部等号"="的个数 记下这个个数
// 把等号换成A("=" => "0" => Base64Code[0]= 'A')
// 在数据字典中寻找字符 记下索引号
// 索引号转二进制连接起来
// 去掉末尾的8位或16位的二进制0
// 每八位取二进制数据 转换成字符
// 连接每个字符
// 完成
#endregion
int iEqualCount = 0;
string strReturnValue = "";
if(pStrBase64String.Substring(pStrBase64String.Length - 2 , 1) == "=")
{
iEqualCount = 2;
pStrBase64String = pStrBase64String.Remove(pStrBase64String.Length - 2 , 2);
pStrBase64String = pStrBase64String.Insert(pStrBase64String.Length , "A");
pStrBase64String = pStrBase64String.Insert(pStrBase64String.Length , "A");

}
else if(pStrBase64String.Substring(pStrBase64String.Length - 1 , 1) == "=")
{
iEqualCount = 1;
pStrBase64String = pStrBase64String.Remove(pStrBase64String.Length - 1 , 1);
pStrBase64String = pStrBase64String.Insert(pStrBase64String.Length , "A");
}
ArrayList arrIndex = new ArrayList();
for(int i = 0 ; i < pStrBase64String.Length ; i ++)
{
for(int j = 0 ; j < 64 ; j ++)
{
if(pStrBase64String.Substring(i , 1) == Base64Code[j].ToString())
{
arrIndex.Add(j);
break;
}
}
}
string strBinaryString = "";
string strTmp = "";
for(int i = 0 ; i < arrIndex.Count ; i ++)
{
strTmp = Number.ToBinary(Convert.ToInt32(arrIndex[i])).Remove(0 , 2);
strBinaryString += strTmp;
}
if(iEqualCount == 1)
{strBinaryString = strBinaryString.Remove(strBinaryString.Length - 8 , 8);}
else if(iEqualCount == 2)
{strBinaryString = strBinaryString.Remove(strBinaryString.Length - 16 , 16);}
for(int i = 0 ; i < strBinaryString.Length / 8 ; i ++)
{
strReturnValue += Convert.ToChar(Number.ToInt(strBinaryString.Substring(i * 8 , 8))).ToString();
}
return strReturnValue;
}
#endregion
}
}
...全文
125 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
New919 2006-08-10
  • 打赏
  • 举报
回复
我写的代码就是Convert.ToBase64String()方法的实现过程
Avoid 2006-08-10
  • 打赏
  • 举报
回复
LZ想说明什么?
New919 2006-08-10
  • 打赏
  • 举报
回复
using System;

namespace Shaka.Common
{
/// <summary>
///
/// </summary>
public class Number
{

#region 二进制字符串不足八位的补零
/// <summary>
/// 二进制字符串不足八位的补零
/// </summary>
/// <param name="pStrSource"></param>
/// <returns></returns>
public static string Fill(string pStrSource)
{
switch(pStrSource.Length)
{
case 1:return "0000000" + pStrSource;
case 2:return "000000" + pStrSource;
case 3:return "00000" + pStrSource;
case 4:return "0000" + pStrSource;
case 5:return "000" + pStrSource;
case 6:return "00" + pStrSource;
case 7:return "0" + pStrSource;
default:return pStrSource;
}
}
#endregion

#region Int32 Cnvert To Binary String
/// <summary>
/// Int32 Cnvert To Binary String
/// </summary>
/// <param name="piNumber"></param>
/// <returns></returns>
public static String ToBinary(int piNumber)
{
string strBinary = "";
int iTmp;
do
{
iTmp = piNumber % 2;
strBinary = iTmp.ToString() + strBinary;
piNumber = piNumber /2;
}while(piNumber != 0);
return Fill(strBinary);
}
#endregion

#region Int64 Convert To Binary String
/// <summary>
/// Int64 Convert To Binary String
/// </summary>
/// <param name="plNumber"></param>
/// <returns></returns>
public static String ToBinary(long plNumber)
{
string strBinary = "";
long iTmp;
do
{
iTmp = plNumber % 2;
strBinary = iTmp.ToString() + strBinary;
plNumber = plNumber /2;
}while(plNumber != 0);
return strBinary;
}
#endregion

#region 二进制字符串转换为整形
/// <summary>
/// 二进制字符串转换为整形
/// </summary>
/// <param name="pStrBinary"></param>
/// <returns></returns>
public static int ToInt(string pStrBinary)
{
char[] charArr = pStrBinary.ToCharArray();
int iReturnValue = 0;
int iPow = 0;
for(int i = 0 ; i < charArr.Length ; i ++)
{
if(charArr[i].ToString() != "0" && charArr[i].ToString() != "1")
{throw new Exception("输入字符串格式不正确!");}
}
for(int i = 0 ; i < charArr.Length ; i ++)
{
iPow = Convert.ToInt32(charArr[i].ToString());
iReturnValue += iPow * Convert.ToInt32(Math.Pow(2 , charArr.Length - i - 1));
}
return iReturnValue;
}
#endregion
}
}

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧