注意本算法只能处理由 0,1,2,3,4,5,6,7,8,9 和逗号 这是个字符组成的内容, 如要支持 小数点,回车等,可做简单的扩展。
本算法将 0 到 9 , 加上 逗号, 共 11 个字符, 二个字符一组作为排列组合, 共有 121 总排列,用一个字节表示, 这样理论上
n 字符的串,可变成 n/2 个长度的字符, 然后将这 n/2 长度的字节数据做 base64 编码, 长度又增加为 4/3 陪, 所以总的长度为:
n/2 * 4/3 =2n/3 , 即长度大概缩小了 三分之一 字符数,内容也得到了初步的加密。 算法可逆。
程序如下,请大家评测:
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class ZipTest {
public static String decode(byte[] b){
String ret="";
for(int i=0;i<b.length;i++){
ret+=decode(b[i]);
}
return ret;
}
public static String decode(byte b){
int i=b;
if(i<0){
i+=256;
}
if(i>=200){
i=i-200;
return String.valueOf(toChar(i));
}
int h=i/11;
int l=i%11;
return String.valueOf(toChar(h))+String.valueOf(toChar(l));
}
public static byte[] encode(String msg){
int len=msg.length()/2;
if(msg.length()%2>0){
len++;
}
byte []e=new byte[len];
int i=0;
int k=0;
while(i<msg.length() && i+1<msg.length()){
e[k]=encode(msg.charAt(i),msg.charAt(i+1));
i+=2;
k++;
}
if(i<msg.length()){
e[k]=encode(msg.charAt(i));
}
return e;
}
public static int toInt(char c){
if(c==',') return 0;
return (c-'0')+1;
}
public static char toChar(int i){
if(i==0) return ',';
return (char)(i+'0'-1);
}
public static byte encode(char c1,char c2){
int h=toInt(c1);
int l=toInt(c2);
int i=h*11+l;
return (byte)i;
}
public static byte encode(char c1){
int h=toInt(c1);
int i=200+h;
return (byte)i;
}
public static String replaceChars(String ret) {
ret = ret.replace('+', '_');
ret = ret.replace('/', '.');
ret = ret.replace('=', '-');
return ret;
}
public static String restoreChars(String ret) {
ret = ret.replace('_', '+');
ret = ret.replace('.', '/');
ret = ret.replace('-', '=');
return ret;
}
public static void main(String []args)throws Exception {
//<月亮智商人民>下载地址http://wap.music.ovi.com.cn/rt/d/?p=44字符
String msg="10234567,"+"12345678901,"+System.currentTimeMillis()+",0,0,0";
System.out.println(msg+"\t"+msg.length());
System.out.println();
byte []ec=encode(msg);
for(int i=0;i<ec.length;i++){
System.out.print((int)ec[i]+",");
}
System.out.println();
BASE64Encoder base64=new BASE64Encoder();
String ret=replaceChars(base64.encode(ec));
System.out.println(ret);
BASE64Decoder de=new BASE64Decoder();
byte []m=de.decodeBuffer(restoreChars(ret));
for(int i=0;i<m.length;i++){
System.out.print((int)m[i]+",");
}
System.out.println();
System.out.println(decode(m));
}
}