怎样将类似"2297725","02456847"的数字字符串   变成一个5个长度的字符串   要可还原  

解决方案 »

  1.   

    可以相邻的两个数字作为一个字符的int值。
    例如:
    char char1 = (char)22;
    char char2 = (char)97;
    char char3 = (char)72;
    char char4 = (char)5;
    然后在组合成一个字符串。
    这样是可以压缩一下的,不知道你的数字字符串最大长度有没有限制。如果没有,那肯定无法实现。
    如果有限制,可以再考虑加一个奇偶位标志的char。细节就不说了,原则上是可以实现的。
      

  2.   

    用进制压缩不是很完美,毕竟5位长度,表示的数据有限,除非数据有规定最大限度
    for example
    import java.util.*;
    public class Test {
        public static void main(String[] args) throws Throwable {
            String base = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; //用于进制表示
            char[] key = base.toCharArray();
            int dig = base.length();
            System.out.printf("max length:%d\n", (long)Math.pow(dig, 4)); //最大能表示的数
            String[] code = {"2297725","02456847"};//原始测试数据
            System.out.println("----------original code----------");
            System.out.println(Arrays.toString(code));
            StringBuilder buf = new StringBuilder();
            System.out.println("----------encode----------");
            String[] encode = new String[code.length];
            for (int i=0; i<code.length; i++) { //用进制的方式压缩
                buf.delete(0, buf.length());
                int n = Integer.valueOf(code[i]);
                while (n > 0) {
                    buf.insert(0, key[n%dig]);
                    n /= dig;
                }
                buf.insert(0, key[code[i].length()%dig]); //前一位表示原始数据长度,因为考虑原始数据开头是0的情况
                
                encode[i] = buf.toString();
            }
            System.out.println(Arrays.toString(encode));
            
            System.out.println("----------decode----------");
            String[] decode = new String[encode.length];
            for (int i=0; i<encode.length; i++) { //解压数据,用进制换算回来
                buf.delete(0, buf.length());
                char[] c = encode[i].toCharArray();
                int len = base.indexOf(c[0]); //先获取原始数据的长度
                int sum = 0;
                for (int j=1; j<c.length; j++) { //再按进制换算回来
                    sum = sum*dig + base.indexOf(c[j]);
                }
                buf.append(sum);
                for (int j=0; j<len-buf.length(); j++) {
                    buf.insert(0, "0");
                }
                
                decode[i] = buf.toString();
            }
            System.out.println(Arrays.toString(decode));        
        }
    }
      

  3.   

    你应该先把用途说明白了,如果转换后的字符串是用来保存的,只要没超过int类型变量的上限值,就可以只用4个字节保存。你转换后的字符串到底干嘛用的?