`
thingkau
  • 浏览: 72459 次
  • 性别: Icon_minigender_1
  • 来自: 泉州
社区版块
存档分类
最新评论

字节数增倍编码

阅读更多
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;
	}

}
分享到:
评论

相关推荐

    matlab代码csma-cobss-matlab:用于MATLAB的流式一致开销字节填充(COBS)

    在内存受限的硬件应用中,流方法需要的内存比块编码方法少得多,块编码方法需要的内存几乎是编码消息大小的两倍。 我开发了这个专门用于我的半双工项目,我在硬件实现之前在 MATLAB 中建模。 我的更快的块编码方法的...

    AMR音频编码器概述及文件格式分析

    AMR音频编码器概述及文件格式分析 相对于IF1, IF2 省去了Frame Quality Indicator, ...因为AMR帧中数据的长度并不是字节(8bit)的整数倍,所以在有些帧的末尾需要增加bit填充,以使整个帧的长度达到字节的整数倍。

    精易模块[永久免费] V3.12

    ' 修复 - 编码_ansi到usc2() 加快N倍的转换速度 ' 修复 - 编码_URL编码GBK () 第二个参数无效的问题 ' 修复 - 运算_表达式计算() 出现数据格式错误的部分问题 ' 修复 - 文本_颠倒 () '命令中文字出现乱码 ' 修复 - ...

    上位机与PLC在以太网中基于编码方式的通讯方法 (2003年)

    在三菱A系列PLC中利用E71以太网通讯模块,通过TCP/IP协议开发了一种与上位机通讯的新型编码方法,用组态王6.0实现设计,结合实际给出了...经过该方法处理后,同样一个字节的信息量增加了8倍,提高了网络的信息流量。

    易语言精易万能模块V2.5

    ' 去掉所有普通填表类命令里的类型参数,改为全智能判断,填表速度将提高1倍以上; '以下是新增加的 ' 编码_BIG5到繁体 () ' 编码_BIG5到简体 () ' 编码_繁体到BIG5 () ' 编码_简体到BIG5 () ' 编码_ansi转usc2 () ' ...

    精易模块[源码] V5.15

    5、公开子程序(字节集_到文本|字节集_到整数|字节集_取左边|字节集_取右边|字节集_取空白|字节集_取长度|字节集_取中间|字节集_替换|字节集_寻找|字节集_取指针)模块原有命令。 6、修正“文本_取中间_批量”当参数...

    精易官方免费模块v3.60版

    5.完善 DLL“_宽字符到双字节”和“_宽字符到双字节1”的备注 方便区分 1.修复“编码_Unicode到Utf8”,感谢 90后辉煌 的提醒 2.修复“系统_取宽带用户名密码”因 编码_Unicode到Utf8 有问题导致的问题 感谢 wjjucwj...

    信令分析工具 V2.01

    主要原因可能在于以前的版本只支持TUP消息统计,消息参数都比较少,所以数组开了100个字节的空间。考虑到ISUP消息最长为272个,但转换为文本的字符表示,还要加空格,基本上是3倍的关系。所以目前的消息长度定位600...

    海康视频卡动态库

    /// 此DSP所包含的编码通道个数 /// uint encodeChannelCount; /// /// 此DSP上第一个编码通道在所有编码通道中的索引 /// uint firstEncodeChannelIndex; /// /// 此DSP所包含的解码通道个数 /// ...

    万能文本编辑器V1.3

    在输出窗口中,可直接显示选定内容的各种编码转换结果,字数、字节数统计等; 8、 文件夹数据获取:获取整个文件夹中的文件列表,获取整个文件夹中的文件夹列表,获取前面两者; 9、 16进制编辑:简单实用,看了就...

    xise寄生虫破解版

    多线程线程池操作,API编写,字节集读取,winhttpAPI访问,真正达到毫秒级反应 更适合新手使用,不仅有可视界面,并带有一键返回网站根目录,让你完全掌握自身方位 支持在4种语言的SHELL内自动生成内页 自动识别...

    XISE WBMS管理 V8.86 破解版

    多线程线程池操作,API编写,字节集读取,winhttpAPI访问,真正达到毫秒级反应 更适合新手使用,不仅有可视界面,并带有一键返回网站根目录,让你完全掌握自身方位 支持在4种语言的SHELL内自动生成内页 自动识别...

    rar压缩软件.rar

    默认, 控制台 RAR 的列表文件中使用单字节编码。但是可以使用 -sc&lt;字符集&gt;l 开关重定义。 你可以在同一命令行指定普通文件名和列表文件。如果文件和列表 文件都未被指定,那么 RAR 将默认是 *.*,来处理所有...

    python-3.7.0b5下載

    time 模块新增纳秒级函数支持,新函数将纳秒数作为整数值返回 CPython 部署改进: 避免使用 ASCII 作为默认文本编码 PEP 552,deterministic .pycs 新的 runtime 模式 PEP 565,改进了 DeprecationWarning ...

    51单片机C语言编程基础及实例

    如果将一个 16 位二进数赋给一个 8 位的字节变量,则自动截断为低 8 位,而丢掉高 8 位。 ++var 表示对变量 var 先增一;var—表示对变量后减一。 x |= 0x0f;表示为 x = x | 0x0f; 高四位。 6. While( 1 ); 表示...

    操作系统精髓与设计原理答案

    地址为300的指令的内容(值为十六进制数1940)被送入MBR,并且PC增1。这两个步骤是并行完成的。 c. MBR中的值被送入指令寄存器IR中。 2. a. 指令寄存器IR中的地址部分(940)被送入MAR中。 b. 地址940中的值被...

    华为编程开发规范与案例

    本意是想移动10个字节,可是实际上指针移动了10*sizeof(struct MsgCB)个字节; CellNum=tmp_msg.usCellNum; 。。。 } 1 所以结构指针传入函数后,如要进行指针移动操作,最好先将其转化为_UC型再说。总之指针操作...

    数据结构(C++)有关练习题

    3、从终端读入字符集大小为n(即字符的个数),逐一输入n个字符和相应的n个权值(即字符出现的频度),建立哈夫曼树,进行编码并且输出。 注:可用C或C++编写。 4、用邻接矩阵或邻接图实现一个有向图的...

    自己动手写操作系统(含源代码).part2

    读者可以根据路线图逐步完成各部分的功能,从而避免了一开始就面对整个操作系统数万行代码时的迷茫和挫败感。书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地认识操作系统的核心原理...

    自己动手写操作系统(含源代码).part1

    读者可以根据路线图逐步完成各部分的功能,从而避免了一开始就面对整个操作系统数万行代码时的迷茫和挫败感。书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地认识操作系统的核心原理...

Global site tag (gtag.js) - Google Analytics