字节数增倍编码

byte能表示从0~127(128个)字符,字符表示最多占用前6位,即111111=127,前两位基本上属于多余。在网上传输时,显然用base64比较节省带宽。
不过,字节数增倍编码编码速度可能比较快,虽然占用大的带宽。

public class GetDoubleBytes {

public static void main(String[] args){
String ds = getDoubleBytesStr("张".getBytes());
System.out.println(ds);
}

/**
* 主调方法
* @param s
* @return
*/
public static String getDoubleBytesStr(byte[] bs){
StringBuilder sb = new StringBuilder();
for(int i = 0; i < bs.length; i++){
sb.append(padHexString(toHexString(bs[i])));
}
return sb.toString();
}

/** Add '0' in front of one byte hexa character to make it 2 bytes. */
public static String padHexString(String hexNum) {
if (hexNum.length() < 2) {
return "0" + hexNum;
}
return hexNum;
}

/**
* 用十六进制0-9,a-f表示一个byte,并以字符串的形式返回
* 16进去,"10"出来
* 15进去,"f"出来
*/
public static String toHexString(byte b){
return Integer.toHexString(0xff & b);
}

}


结果打印:d5c5

另法:

public class GetDoubleBytes2 {
public final static String[] _hexLookupTable = {"00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f","50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f","60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f","70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f","80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f","90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af","b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf","c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df","e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff"};

public static void main(String[] args){
String ds = getDoubleBytesStr("张".getBytes());
System.out.println(ds);
}

/**
* 主调方法
* @param s
* @return
*/
public static String getDoubleBytesStr(byte[] bs){
StringBuilder sb = new StringBuilder();
for(int i = 0; i < bs.length; i++){
sb.append(_hexLookupTable[ 0xff & bs[i] ]);
}
return sb.toString();
}

}


画蛇添足:
你可能需要如下方法

/**
* 生成_hexLookupTable的字符串
* @return
*/
public static String gen_hexLookupTable(){
StringBuilder sb = new StringBuilder();
sb.append("public final static String[] _hexLookupTable = {");
for(int i=0;i<256;i++){

sb.append("\"");

sb.append(padHexString(toHexString((byte)i)));

sb.append("\"");
sb.append(",");

}
sb.deleteCharAt(sb.length()-1);
sb.append("};");
return sb.toString();
}


以下是解码:

public class DoubleBytesDecoder {

/**
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
String s = "张3";

String es = GetDoubleBytes.getDoubleBytesStr(s.getBytes());

System.out.println(es);//打印d5c533

System.out.println(new String(decoderDoubleBytes(es)));//打印 "张3"

}

/**
* 将双倍字节字符串解码成单倍字节码数组
* @param encodedStr
* @return
* @throws Exception
*/
public static byte[] decoderDoubleBytes(String encodedStr) throws Exception {

if(encodedStr.length()%2!=0){
throw new Exception("无效的编码");
}
byte[] bs = new byte[encodedStr.length()/2];

for(int i=0;i<bs.length; i++){
bs[i]=(byte)Integer.parseInt(encodedStr.substring(2*i, 2*(i+1)), 16);
}

return bs;
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值