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 中建模。 我的更快的块编码方法的...
AMR音频编码器概述及文件格式分析 相对于IF1, IF2 省去了Frame Quality Indicator, ...因为AMR帧中数据的长度并不是字节(8bit)的整数倍,所以在有些帧的末尾需要增加bit填充,以使整个帧的长度达到字节的整数倍。
' 修复 - 编码_ansi到usc2() 加快N倍的转换速度 ' 修复 - 编码_URL编码GBK () 第二个参数无效的问题 ' 修复 - 运算_表达式计算() 出现数据格式错误的部分问题 ' 修复 - 文本_颠倒 () '命令中文字出现乱码 ' 修复 - ...
在三菱A系列PLC中利用E71以太网通讯模块,通过TCP/IP协议开发了一种与上位机通讯的新型编码方法,用组态王6.0实现设计,结合实际给出了...经过该方法处理后,同样一个字节的信息量增加了8倍,提高了网络的信息流量。
' 去掉所有普通填表类命令里的类型参数,改为全智能判断,填表速度将提高1倍以上; '以下是新增加的 ' 编码_BIG5到繁体 () ' 编码_BIG5到简体 () ' 编码_繁体到BIG5 () ' 编码_简体到BIG5 () ' 编码_ansi转usc2 () ' ...
5、公开子程序(字节集_到文本|字节集_到整数|字节集_取左边|字节集_取右边|字节集_取空白|字节集_取长度|字节集_取中间|字节集_替换|字节集_寻找|字节集_取指针)模块原有命令。 6、修正“文本_取中间_批量”当参数...
5.完善 DLL“_宽字符到双字节”和“_宽字符到双字节1”的备注 方便区分 1.修复“编码_Unicode到Utf8”,感谢 90后辉煌 的提醒 2.修复“系统_取宽带用户名密码”因 编码_Unicode到Utf8 有问题导致的问题 感谢 wjjucwj...
主要原因可能在于以前的版本只支持TUP消息统计,消息参数都比较少,所以数组开了100个字节的空间。考虑到ISUP消息最长为272个,但转换为文本的字符表示,还要加空格,基本上是3倍的关系。所以目前的消息长度定位600...
/// 此DSP所包含的编码通道个数 /// uint encodeChannelCount; /// /// 此DSP上第一个编码通道在所有编码通道中的索引 /// uint firstEncodeChannelIndex; /// /// 此DSP所包含的解码通道个数 /// ...
在输出窗口中,可直接显示选定内容的各种编码转换结果,字数、字节数统计等; 8、 文件夹数据获取:获取整个文件夹中的文件列表,获取整个文件夹中的文件夹列表,获取前面两者; 9、 16进制编辑:简单实用,看了就...
多线程线程池操作,API编写,字节集读取,winhttpAPI访问,真正达到毫秒级反应 更适合新手使用,不仅有可视界面,并带有一键返回网站根目录,让你完全掌握自身方位 支持在4种语言的SHELL内自动生成内页 自动识别...
多线程线程池操作,API编写,字节集读取,winhttpAPI访问,真正达到毫秒级反应 更适合新手使用,不仅有可视界面,并带有一键返回网站根目录,让你完全掌握自身方位 支持在4种语言的SHELL内自动生成内页 自动识别...
默认, 控制台 RAR 的列表文件中使用单字节编码。但是可以使用 -sc<字符集>l 开关重定义。 你可以在同一命令行指定普通文件名和列表文件。如果文件和列表 文件都未被指定,那么 RAR 将默认是 *.*,来处理所有...
time 模块新增纳秒级函数支持,新函数将纳秒数作为整数值返回 CPython 部署改进: 避免使用 ASCII 作为默认文本编码 PEP 552,deterministic .pycs 新的 runtime 模式 PEP 565,改进了 DeprecationWarning ...
如果将一个 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型再说。总之指针操作...
3、从终端读入字符集大小为n(即字符的个数),逐一输入n个字符和相应的n个权值(即字符出现的频度),建立哈夫曼树,进行编码并且输出。 注:可用C或C++编写。 4、用邻接矩阵或邻接图实现一个有向图的...
读者可以根据路线图逐步完成各部分的功能,从而避免了一开始就面对整个操作系统数万行代码时的迷茫和挫败感。书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地认识操作系统的核心原理...
读者可以根据路线图逐步完成各部分的功能,从而避免了一开始就面对整个操作系统数万行代码时的迷茫和挫败感。书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地认识操作系统的核心原理...