分享
 
 
 

编码系列--Base24编码

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

0、写在前面

Windows和Office的序列号就是在最终换算之后,通过Base24编码转换成为可显示字符串的。写这个系列的目的就是做类似的东东。

1、编码原理

在Base32的那篇文章中已经比较详细的说明了,这里只指出与原理相比较,Base24是一个非常奇怪的方案,因为用4个bits作为分码段,只能用到16个,另外8个编码字符用不到,而采用5个bits作为分码段,又少8个字符。这就是之前写了个Base32的原因。

后来想明白了这个问题,还是4个bits一组,然后在通过另外一种方式把24个字符都用上不就行了,我采用的是比较愚蠢的方式,按照位置取8的余数,再加上编码值换算即可。总之样子上已经没啥区别了。

先申明,我并不知道MS采用的Base24的具体的方式是什么,因为和我描述的不同,因为据说它是将114bit编码成为200个bits(25个Bytes),我说的方法显然做不到。目前就到这个地步吧,有空再想想。

2、源代码

只把Encoding和Decoding的两个函数贴出来,其他的都雷同。

public new static String Encode(Byte[] abData)

{

Int32 dwLoop = 0,dwCharIndex = 0,dwCharCount = 0,dwRem = 0;

Char[] acPart = null;

StringBuilder sbOutput = null;

if (abData == null || m_acBaseMap == null || m_acBaseMap.Length < m_dwMapLength)

return null;

try

{

dwCharCount = abData.Length * 2;

sbOutput = new StringBuilder(dwCharCount);

acPart = new Char[2];

}

catch (Exception e)

{

Trace.WriteLine("CLsBase24.Encode: Initialize buffer failed! " + e.Message);

}

if (acPart == null || sbOutput == null)

return null;

for(dwLoop = 0;dwLoop < abData.Length;dwLoop++)

{

Array.Clear(acPart,0,acPart.Length);

// ONE byte will split to TWO characters

Math.DivRem(dwLoop,9,out dwRem);

dwCharIndex = abData[dwLoop] >> 4 + dwRem;

acPart[0] = m_acBaseMap[dwCharIndex];

dwCharIndex = (abData[dwLoop] & 0x0F) + dwRem;

acPart[0] = m_acBaseMap[dwCharIndex];

sbOutput.Append(acPart,0,acPart.Length);

}

return sbOutput.ToString();

}

public new static Byte[] Decode(String sData)

{

Int32 dwLoop = 0,dwLength = 0,dwRem = 0;

Int32[] dwCharIndex = null;

Byte[] abOutput = null;

Char[] acInput = null;

if (sData == null || sData == String.Empty)

return null;

acInput = sData.ToCharArray();

if (acInput == null)

return null;

try

{

dwLength = acInput.Length / 2;

abOutput = new Byte[dwLength];

dwCharIndex = new Int32[2];

}

catch (Exception e)

{

Trace.WriteLine("CLsBase24.Decode: Initialize buffer failed! " + e.Message);

}

if (acInput == null)

return null;

dwLength = 0;

for (dwLoop = 0;dwLoop < acInput.Length;dwLoop += 2)

{

Array.Clear(dwCharIndex,0,dwCharIndex.Length);

// TWO character can merage ONE byte

Math.DivRem(dwLoop / 2,9,out dwRem);

switch (acInput.Length - dwLoop)

{

case 1:

dwCharIndex[0] = GetCharIndex(acInput[dwLoop]) - dwRem;

abOutput[dwLength] = (Byte) (dwCharIndex[0] << 4);

break;

default:

dwCharIndex[0] = GetCharIndex(acInput[dwLoop]) - dwRem;

dwCharIndex[1] = GetCharIndex(acInput[dwLoop + 1]) - dwRem;

abOutput[dwLength] = (Byte) (dwCharIndex[0] << 4 + dwCharIndex[1]);

break;

}

dwLength++;

}

return abOutput;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有