字节数增倍编码
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);}}
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 stubString s = "张3";String es = GetDoubleBytes.getDoubleBytesStr(s.getBytes());System.out.println(es);//打印d5c533System.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;}}