编码
0、写在前面
这里讨论的编码主要的目的是将不可显示的二进制数组转变为可显示的字符串,包括其逆运算。通过特
定的协议传输数据,或者加密解密的时候都会用到类似的方法。
在这类运算中用的比较多的是 Base64,比如 MIME 中,DotNET 中更是直接提供了 Base64Encode 和
Decode 的方法,相当方便。但是 Base64 通常由“a-z”、“A-Z”、0-9 以及“+”和“=”这些符号组成,当中包
含了很多混淆的字符,例如“1”、“I”和“l”,“0”和“O”或者“2”和“Z”,看起来总是不爽。特别是当作为序列号
编码时,是不应该包含容易混淆的字母,所以有另一种编码形式叫做 Base24,用过 MS 产品的兄弟们一
定非常熟悉。但是 Base24 在实现上还要多绕一个弯,先放一放,我们先说 Base32,能够基本满足要求
的,又非常直观的编码方式。
1、编码原理
Base32 的原理和 Base64 一模一样,Base64 顾名思义就是用 64 个可显示字符表示所有的 ASC 字符,
64 也就是 6Bits,而 ASC 字符一共有 256 个,也就是 8Bits,很简单了,取一下最小公约数,24 位,言
下之意就是用 4 个 Base64 的字符来表示 3 个 ASC 字符。即在编码时,3 个一组 ASC 字符,产生 4 个
Base64 字符,解码时 4 个一组,还原 3 个 ASC 字符。根据这个原理 Base64 编码之后的字符串应该比原
先增加 1/3 的长度。
这里所谓的编码就是一次取 6Bits,换算出来的值作为索引号,利用这个索引数,到预先定义的长度为 64
的字符数组中取相应的字符替换即可;解码就是逆运算,根据字符取在预定义数组中的索引值,然后按
8Bits 一组还原 ASC 字符。
Base32 和 Base64 相比只有一个区别就是,用 32 个字符表示 256 个 ASC 字符,也就是说 5 个 ASC 字符
一组可以生成 8 个 Base 字符,反之亦然。
2、源代码
对于实现这样的功能的代码,毫无难度,如果不考虑效率的,只要细心点,肯定不会错。有人写一次就
够了,所以拿出来和大家一起分享。
下面这个类还额外提供了一个功能就是可以自定义编码的字符串,注意 Base32Map 这个属性。
/// *******************************************************************************
/// Name:CBase32.cs
/// Module: CBase32
using System;
using System.Text;
namespace Mittermeyer
{
/// <summary>
/// Summary description for CBase32.
/// </summary>
public class CBase32
{
private const StringDefaultBase32Map = "ABCDEFGHIJKLMNPQRSTUVWXYZ3456789";
private const Int32Base32MapLength = 32;
private static Char[]m_acBase32Map = null;
1