バイト数逓倍符号化

6882 ワード

byteは0~127(128文字)から、文字は最大で上位6桁、すなわち111111=127を表すことができ、上位2桁は基本的に余分である.ネットワーク上で伝送する場合、base 64を使用すると帯域幅が節約されることは明らかである.
ただし、大きな帯域幅を占有するが、バイト数の倍増符号化の符号化速度は比較的速くなる可能性がある.

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

}

結果印刷:d 5 c 5
別の方法:

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

}