java 16进制与字符串直接相互转换

CreationTime--2018年7月12日09点39分

Author:Marydon

1.16进制转换成字符串

/**
* 16进制直接转换成为字符串
* @explain
* @param hexStr 16进制字符串
* @return String (字符集:UTF-8)
*/
public static String fromHexString(String hexString) throws Exception {
// 用于接收转换结果
String result = "";
// 转大写
hexString = hexString.toUpperCase();
// 16进制字符
String hexDigital = "0123456789ABCDEF";
// 将16进制字符串转换成char数组
char[] hexs = hexString.toCharArray();
// 能被16整除,肯定可以被2整除
byte[] bytes = new byte[hexString.length() / 2];
int n; for (int i = 0; i < bytes.length; i++) {
n = hexDigital.indexOf(hexs[2 * i]) * 16 + hexDigital.indexOf(hexs[2 * i + 1]);
bytes[i] = (byte) (n & 0xff);
}
// byte[]-->String
result = new String(bytes, "UTF-8");
return result;
}  

2.字符串转换成大写的16进制字符串

/**
* 字符串转换成为16进制字符串(大写)
* @explain 因为java转义字符串在java中有着特殊的意义,
* 所以当字符串中包含转义字符串,并将其转换成16进制后,16进制再转成String时,会出问题:
* java会将其当做转义字符串所代表的含义解析出来
* @param str 字符串(去除java转义字符)
* @return 16进制字符串
* @throws Exception
*/
public static String toHexString(String str) throws Exception {
// 用于接收转换结果
String hexString = "";
// 1.校验是否包含特殊字符内容
// java特殊转义符
// String[] escapeArray = {"\b","\t","\n","\f","\r","\'","\"","\\"};
String[] escapeArray = {"\b","\t","\n","\f","\r"};
// 用于校验参数是否包含特殊转义符
boolean flag = false;
// 迭代
for (String esacapeStr : escapeArray) {
// 一真则真
if (str.contains(esacapeStr)) {
flag = true;
break;// 终止循环
}
}
// 包含特殊字符
if (flag) throw new Exception("参数字符串不能包含转义字符!"); // 16进制字符
char[] hexArray = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
StringBuilder sb = new StringBuilder();
// String-->byte[]
byte[] bs = str.getBytes();
int bit;
for (int i = 0; i < bs.length; i++) {
bit = (bs[i] & 0x0f0) >> 4;
sb.append(hexArray[bit]);
bit = bs[i] & 0x0f;
sb.append(hexArray[bit]);
}
hexString = sb.toString();
return hexString;
}  

3.测试

/**
*
* @explain
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// 其中,\'\"\\ 实际字符串代表:'"\
String str = "张三&$李四((、,//\'\"\\‘’“”+-*/!!~.。=——??;;";
String hexStr = toHexString(str);
System.out.println(hexStr);
System.out.println(fromHexString(hexStr));
}

4.说明

  要想将特殊转义符当作字符串来正常解析,需要自己再手动进行转义,比如:

// 输出\\
String str = "\\\\";
String hexStr = toHexString(str);
System.out.println(hexStr);
System.out.println(fromHexString(hexStr));
// 输出\n
str = "\\n";
hexStr = toHexString(str);
System.out.println(hexStr);
System.out.println(fromHexString(hexStr));

  toHexString()方法中,调用的contains(param)方法,不需要转义,而是将param当作纯字符串来解析,所以能校验通过!

 

java 16进制与字符串直接相互转换的更多相关文章

  1. Java中16进制与字符串之间的相互转换

    笔者前几日在开服过程中需要将字符串转化成为16进制的字符串,在网上找到了一些方法尝试之后,均发现存在一个问题-->字符串转为16进制后再转回来,英文正常,中文出现乱码 经过考虑决定通过以下方式进 ...

  2. C# 16进制与字符串、字节数组之间的转换(转)

    1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串   //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToSt ...

  3. carryLess小笔记001_Java中16进制与字符串之间的相互转换

    笔者前几日在开服过程中需要将字符串转化成为16进制的字符串,在网上找到了一些方法尝试之后,均发现存在一个问题-->字符串转为16进制后再转回来,英文正常,中文出现乱码 经过考虑决定通过以下方式进 ...

  4. C# 16进制与字符串、字节数组之间的转换 (转载)

    1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制 Console.WriteLine(, )); //十进制转八进制 Console.WriteLine(, )); / ...

  5. C#串口通讯,16进制与字符串、字节数组之间的转换。

    1.将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, ...

  6. C# 16进制与字符串、字节数组之间的转换

    1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串//十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToStrin ...

  7. Python输出16进制不带0x补零,整数转16进制,字符串转16进制

    Python输出16进制不带0x补零,整数转16进制,字符串转16进制   在开发中,我们偶尔会遇到需要将数据通过控制台打印出来,以检查数据传输的准确性.例如调试服务端刚接到的二进制数据(里面包含很多 ...

  8. ByteArray、16进制、字符串之间的转换

    ByteArray.16进制.字符串之间的转换: package fengzi.convert { import flash.utils.ByteArray; public class ByteArr ...

  9. C# 16进制转字符串,字符串转16进制

    { //========================================================== //16进制转字符串 public static byte[] HexTo ...

随机推荐

  1. [转]Sqoop-1.4.4工具import和export使用详解

    FROM :http://shiyanjun.cn/archives/624.html Sqoop可以在HDFS/Hive和关系型数据库之间进行数据的导入导出,其中主要使用了import和export ...

  2. react常用模块介绍

    react各个模块: 1.node.js自带的模块(原生模块):https://www.jianshu.com/p/abc72267abfc原生模块的api文档地址:http://nodejs.cn/ ...

  3. 开启Remote Desktop的PowerShell

    1) Enable Remote Desktop set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Ser ...

  4. 备份VMware虚拟磁盘文件 移植到其他虚拟机

    原文:http://jingyan.baidu.com/article/a681b0de17b3173b1843468f.html 方法/步骤     第一种方法:直接复制本地主机磁盘下的虚拟磁盘文件 ...

  5. vue里ref ($refs)用法

    ref 有三种用法: 1.ref 加在普通的元素上,用this.ref.name 获取到的是dom元素 2.ref 加在子组件上,用this.ref.name 获取到的是组件实例,可以使用组件的所有方 ...

  6. Linux下配置nfs并远程挂载

    nfs是网络文件系统,允许一个节点通过网络访问远程计算机的文件系统,远程文件系统可以被直接挂载到本地,文件操作和本地没有区别,如果是局域网的nfs那么io的性能也可以保证,下面就以CentOS 7.x ...

  7. SSE,MSE,RMSE,R-square指标讲解

    SSE(和方差.误差平方和):The sum of squares due to errorMSE(均方差.方差):Mean squared errorRMSE(均方根.标准差):Root mean ...

  8. 97.5%准确率的深度学习中文分词(字嵌入+Bi-LSTM+CRF)

    本文转载自:http://www.17bigdata.com/97-5%E5%87%86%E7%A1%AE%E7%8E%87%E7%9A%84%E6%B7%B1%E5%BA%A6%E5%AD%A6%E ...

  9. Eclipse版本控制Git不能Pull或者Push

     如下图,addWcLesson.jsp做了修改,但是却显示蓝色√,而且在Eclipse的Git提交插件中也没有监测到修改的文件,导致无法Push and  Commit   原因:之前有些文件执行了 ...

  10. Python输出信息

    Python很多情况下,都是通过Console输出信息,大量翻屏滚动的信息,太乱.而pip安装的效果就很好,只是在一行输出信息,不断变化.网上找资料,不难. 用print的话,跟一个“,”就表示不换行 ...