0、前言
几年前由于做一些和加密有关的工作,所以写了几个编码的示例,包括Base32和Base24,当年示例代码写得比较随手,而且不是完整的部分,仅演示编码解码的过程,存在不少问题。Blog很少打理,发觉不少朋友对这部分比较感兴趣,不更新一下有误导大家的嫌疑呀,所以重新更新一下示例,希望对大家有帮助,同时也希望和大家讨论是否有更有效的算法。
1、完整的示例
再次声明,代码中不保证没有错误,如果给各位的工作代码了困扰,本人只能深表歉意。同时也希望各位问题如果发现错误,请及时指正。
编码函数
public
static
String Encode(Byte[] abData)
... {
Int32 dwLoop = 0, dwCharIndex = 0, dwCharCount;
Char[] acPart = null;
StringBuilder sbOutput = null;
if (abData == null || m_acBaseMap == null || m_acBaseMap.Length < MapLength)
return null;
try
...{
dwCharCount = (Int32)(abData.Length / 5f * 8f) + 1;
sbOutput = new StringBuilder(dwCharCount);
acPart = new Char[8];
}
catch (Exception e)
...{
Trace.WriteLine("CBase32.Encode: Initialize buffer failed! " + e.Message);
}
if (acPart == null || sbOutput == null)
return null;
dwCharCount = 0;
for (dwLoop = 0; dwLoop < abData.Length; dwLoop += 5)
...{
Array.Clear(acPart, 0, acPart.Length);
// every 5 bytes is a unit,can convert to 8 chars
// data format:
// AAAAABBB BBCCCCCD DDDDEEEE EFFFFFGG GGGHHHHH
switch (abData.Length - dwLoop)
...{
case 1:
dwCharIndex = abData[dwLoop] >> 3; // AAAAA
acPart[0] = m_acBaseMap[dwCharIndex];
dwCharIndex = (abData[dwLoop] & 0x7) << 2; // BBB00
acPart[1] = m_acBaseMap[dwCharIndex];
dwCharCount = 2;
... {
Int32 dwLoop = 0, dwCharIndex = 0, dwCharCount;
Char[] acPart = null;
StringBuilder sbOutput = null;
if (abData == null || m_acBaseMap == null || m_acBaseMap.Length < MapLength)
return null;
try
...{
dwCharCount = (Int32)(abData.Length / 5f * 8f) + 1;
sbOutput = new StringBuilder(dwCharCount);
acPart = new Char[8];
}
catch (Exception e)
...{
Trace.WriteLine("CBase32.Encode: Initialize buffer failed! " + e.Message);
}
if (acPart == null || sbOutput == null)
return null;
dwCharCount = 0;
for (dwLoop = 0; dwLoop < abData.Length; dwLoop += 5)
...{
Array.Clear(acPart, 0, acPart.Length);
// every 5 bytes is a unit,can convert to 8 chars
// data format:
// AAAAABBB BBCCCCCD DDDDEEEE EFFFFFGG GGGHHHHH
switch (abData.Length - dwLoop)
...{
case 1:
dwCharIndex = abData[dwLoop] >> 3; // AAAAA
acPart[0] = m_acBaseMap[dwCharIndex];
dwCharIndex = (abData[dwLoop] & 0x7) << 2; // BBB00
acPart[1] = m_acBaseMap[dwCharIndex];
dwCharCount = 2;