4-6Bit 压缩,进制转换

public class Decode {

/**
  * @param args
  */
public static void main(String [ ] args) {
        String str="WH0292401";
        char  [ ] ch=new char [str.length() ];

        for(int i=0;i<str.length();i++){
        ch [i ]=str.charAt(i);
        System.out.print(ch [i ]+"\\t");
        }
        System.out.println("");
        int  [ ] charInt=new int [ch.length ];
        String  [ ] hex=new String [ch.length ];
        String  [ ] binary=new String [hex.length ];
        for(int i=0;i<charInt.length;i++){ 
        //获取ASCII码
        charInt [i ]=(int)ch [i ];
        System.out.print(charInt [i ]+"\\t");   
        //转化成16进制
        hex [i ]=Integer.toHexString(charInt [i ]);
        System.out.print(hex [i ]+"\\t"); 
        //16进制转化成2进制字符串
        binary [i ]=hexString2binaryString(hex [i ]);
        } 
        System.out.println("");
        //去掉每个2进制串前两位,并且合成一个字符串
        String finalStr="";
        for(int i=0;i<binary.length;i++){
        System.out.println(binary [i ]);
        binary [i ]=binary [i ].substring(2,binary [i ].length()); 
        System.out.println(binary [i ]);
        finalStr+=binary [i ];
        }
        System.out.println(finalStr); 
        int count =finalStr.length()/8;
        String  [ ] d =new String  [count ]; 
        //按照8位分割
        for(int i=0;i<count;i++){ 
        d [i ]=finalStr.substring(0,8);
        System.out.println(	"divide ["+i+" ]"+d [i ] );
        finalStr = finalStr.substring(8);
        }
        System.out.println("finalStr"+finalStr);
        String  [ ] divide;
        if(finalStr.length()!=0){
        finalStr+="100000".substring(0,8-finalStr.length());
        divide =new String  [count+1 ]; 
        for(int i=0;i<d.length;i++){
        divide [i ]=d [i ];
        } 
        divide [count ]=finalStr;
        }else{
        divide=new String [count ];
        for(int i=0;i<d.length;i++){
        divide [i ]=d [i ];
        } 
        }
        //解码
        String decode="";
        for(int i=0;i<divide.length;i++){
        decode+=binaryString2hexString(divide [i ]);
        }
        System.out.println("decode: "+decode);
        }

//16进制字符串转2进制字符串
public static String hexString2binaryString(String hexString) {
        if (hexString == null || hexString.length() % 2 != 0)
        return null;
        String bString = "", tmp;
        for (int i = 0; i < hexString.length(); i++) {
        tmp = "0000" + Integer.toBinaryString(Integer.parseInt(hexString.substring(i, i + 1), 16));
        bString += tmp.substring(tmp.length() - 4);
        }
        return bString;
        }
//2进制转16
public static String binaryString2hexString(String bString) {
        if (bString == null || bString.equals("") || bString.length() % 8 != 0)
        return null;
        StringBuffer tmp=new StringBuffer();
        int iTmp = 0;
        for (int i = 0; i < bString.length(); i += 4) {
        iTmp = 0;
        for (int j = 0; j < 4; j++) {
        iTmp += Integer.parseInt(bString.substring(i + j, i + j + 1)) << (4 - j - 1);
        }
        tmp.append(Integer.toHexString(iTmp));
        }
        return tmp.toString();
        }
        }
        ``````java
public class Decode1 {

/**
  * @param args
  */
public static void main(String [ ] args) {
        String str="4F6A08408C30C36DF4C308";
        System.out.println(str);
        //去掉4F6A08 这个应该不是需要的数据
        str=str.substring(6,str.length());
        System.out.println(str);
        //计算16进制的个数
        int count =str.length()/2;
        System.out.println("count:"+count);
        //准备分割成16进制的数组
        String  [ ] divide2Hex=new String [count ];
        for(int i=0;i<count;i++){
        //分割
        divide2Hex [i ]=str.substring(0,2);
        str=str.substring(2);
        System.out.println(divide2Hex [i ]);
        } 
        //分割后的16进制转化成2进制并且拼接起来
        String h2bStr="";
        for(int i=0;i<count;i++){ 
        h2bStr+=hexString2binaryString(divide2Hex [i ]); 
        } 
        System.out.println("h2bStr"+h2bStr);
        //把2进制串分割成6bit为一份,不管最后一个是不是需要的数据在都加1存最后一个
        int divide6Count=h2bStr.length()/6+1;
        //准备分割
        String  [ ] h2b =new String [divide6Count ];
        System.out.println("divide6Count"+divide6Count);
        //如果最后一个不是需要的数据,判断舍弃
        boolean flg=false;
        for(int i=0;i<divide6Count-1;i++){ 
        //分割
        h2b [i ]=h2bStr.substring(0,6); 
        System.out.println("分割前"+h2bStr);
        h2bStr=h2bStr.substring(6); 
        System.out.println("分割后"+h2bStr);
        System.out.println("当前6bit"+h2b [i ]);
        System.out.println("第"+(i+1)+"次");
        //检查最后一次是否符合要求
        if(i==divide6Count-2){
        if(!(h2bStr.endsWith("10")||h2bStr.endsWith("1000")||h2bStr.endsWith("100000"))){
        h2b [i+1 ]=h2bStr; 
        }else{
        //是不需要的数据舍弃
        flg=true;
        }
        }
        } 
        //舍弃数据,少一次
        if(flg)divide6Count=divide6Count-1;
        for(int i=0;i<divide6Count;i++){
        //根据文档吧6bit的添加成8bit
        if(h2b [i ].substring(0,1).endsWith("1")){
        h2b [i ]="00"+h2b [i ];
        }else if(h2b [i ].substring(0,1).endsWith("0")){
        h2b [i ]="01"+h2b [i ];
        }else{
        System.out.println("添加异常!");
        }
        System.out.println(h2b [i ]+"\\t");
        }
        for(int i=0;i<divide6Count;i++){
        String a=h2b [i ];
        //2进制转16
        a=binaryString2hexString(a);
        //16转ascii
        a=convertHexToString(a);
        System.out.print(a);
        }
        }

//16进制字符串转2进制字符串
public static String hexString2binaryString(String hexString) {
        if (hexString == null || hexString.length() % 2 != 0)
        return null;
        String bString = "", tmp;
        for (int i = 0; i < hexString.length(); i++) {
        tmp = "0000" + Integer.toBinaryString(Integer.parseInt(hexString.substring(i, i + 1), 16));
        bString += tmp.substring(tmp.length() - 4);
        }
        return bString;
        }
//2进制转16
public static String binaryString2hexString(String bString) {
        if (bString == null || bString.equals("") || bString.length() % 8 != 0)
        return null;
        StringBuffer tmp=new StringBuffer();
        int iTmp = 0;
        for (int i = 0; i < bString.length(); i += 4) {
        iTmp = 0;
        for (int j = 0; j < 4; j++) {
        iTmp += Integer.parseInt(bString.substring(i + j, i + j + 1)) << (4 - j - 1);
        }
        tmp.append(Integer.toHexString(iTmp));
        }
        return tmp.toString();
        }
//16进制转ASCII
public static String convertHexToString(String hex){

        StringBuilder sb = new StringBuilder();
        StringBuilder temp = new StringBuilder();

        for( int i=0; i<hex.length()-1; i+=2 ){

        String output = hex.substring(i, (i + 2)); 
        int decimal = Integer.parseInt(output, 16); 
        sb.append((char)decimal);

        temp.append(decimal);
        }

        return sb.toString();
        }

        }