[原文]一个自创的编码解码算法
在robotter项目(我们为日本人开发的一个web应用项目)的开发中遇到了字符串编码问题。robotter项目采用了微软silverlight beta版,中文和日文有时候在web服务器与silverlight客户端传输的过程中遇到了乱码问题。就算是url encoding过的东西也会产生乱码。只好自己写一个算法解决。
基本思想,采用64进制来表示数据。这是根据16进制的特点来设计的,因为16进制的表示都是两个英文字母或数字的组合,传输中不会乱码。现在,如果存在足够的数字和英文字母,使得64进制可以被表示,那么所有的数据都可以用这个进制来表示。
动手从ascii码表中选择足够多的字母和数字组合,产生64进制,也就是2的6次方。没有更多的不乱码的字母和数字个数可以达到2的7次方。
// 编码字典
public static readonly string codeDictionary = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz{|";
二进制的6位可以表示64,也就是这个字典可以表示从0 --- 2的6次方 - 1 范围内的任何数。
一、根据上面的理论,每个字节的数据可以被编码成两个字节。
每个字节的低6位取出来,以它的值为位置,取出编码字典中的64进制表示符号,而高2位再次编码,这样,一个字节被编码成编码表中数字和英文字母的符号组合。
在实现过程中第二个版本采用了这个编码方法。public static string EncodString2(string rawString)函数和public static string DecodString2(string codingString)函数。
二、在实际应用中发现这种编码有点长。于是改进算法:
按照6位一个编码的思想,把3个字节的原始数据编码成4个字节的64进制代码符号。按照这个思想实现了编码解码的第三个算法版本。public static string EncodString3(string rawString)函数和public static string DecodString3(string codingString)函数。
经过测试,这种编码的长度不足url编码的一半。
付上源代码:(见文章的原始出处)一个自创的编码解码算法