大家都知道base64编码可以把输入的字符串或数据编码成只含有{'A'-'Z', 'a'-'z', '0'-'9', '+', '/'}这64个可打印字符的串,故称为“Base64”。现在我想编码成只含有{ 'A'-'Z', 'a'-'z', '0'-'9'}这62个可打印字符的串,姑且称为“Base62”吧,不知该如何实现?请大家不吝赐教!

解决方案 »

  1.   

    你要base62编码也能做到,先看base64编码:
    Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再映射到{'A'-'Z', 'a'-'z', '0'-'9', '+', '/'}字符上,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3如果m个base62的BYTE能表示n个正常的byte的话,必然有 256^n=62^m,左面的约数只有2,所以右面也必须只有2,所以右面的底数只能是32、16、8、4、2而不能是62(64也不行,超过了62)。所以底数比较适合取32,既256^5=32^8,也就是5个正常字节用8个base62字节标识(确切地说是base32),这样的编码实际是base32,不过为了使用上全部的62个字符,可以在向字符坐映射的时候作些手脚,比如奇数字节映射到前32个字符上,偶数字节映射到后32个字节上,实际是base32的变种
      

  2.   

    up 

    up
    在顶
    up
    接着顶
      

  3.   

    感谢杜杜和其他各位!我原来的想法也是5*8=8*5,5个字节输入编码后输出8个字节,输出是a-z,0,1,2,3,4,5,不足5个字节的倍数时用6,7,8,9补齐,映射的结果字符集只有a-z,0-9杜杜说的base62,可以根据奇偶字节分别去映射前后32个字符能说的详细点么?
    我不大清楚因为一共只有62个字符,而不是32+32=64个
    “前后32个”的意思是不是指的只取前32个或者只取后32个?再者,这种变形的结果比原字符长度增加了3/5,觉得冗余太大
    有没有其他的方法,在base64的3*8=4*6基础上实现base62,映射的时候能否有办法替换掉特殊字符"+","\"和"="呢??
      

  4.   

    希望杜杜能给出替换的思路,效率先不考虑,采用base64查表,替换掉"+",“\”,“=”我的想法是补位用的=号可以用固定的字符标志位来表示,随便用26个字符当中的一个就行,放在最后一位,因为位置固定且特殊,所以解码时不用担心字符内容本身的重复那“+”“\”该如何替换呢?用62个字符中的来替换的话,比如用'a'来代替"+",那怎么区分被替换的'a'和未被替换本来就是的'a'呢?
      

  5.   

    所以说只替换“+/=”而其他码不变就不可能。要节省2个字母只有采用压缩算法,其他的编码的意义就不一样了。最简单的,可以采用霍夫曼(Huffman)编码。