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();
}
}