博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中16进制与字符串之间的相互转换
阅读量:6216 次
发布时间:2019-06-21

本文共 2684 字,大约阅读时间需要 8 分钟。

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

经过考虑决定通过以下方式进行解决: 

  1)在将字符串转为16进制之前先进行一次转化,先将其转化成为Unicode编码(相当于把中文用英文字符代替),在转化成为16进制

  2)相反的,在十六进制转换为字符串后的得到的是Unicode编码,此时再将Unicode编码解码即可获取原始字符串

代码如下:

  *字符串转化为Unicode编码:

/** * 字符串转换unicode */public static String string2Unicode(String string) {  StringBuffer unicode = new StringBuffer();  for (int i = 0; i < string.length(); i++) {    // 取出每一个字符	char c = string.charAt(i);	// 转换为unicode	unicode.append("\\u" + Integer.toHexString(c));  }  return unicode.toString();}

  *字符串转为16进制

/** * 字符串转化成为16进制字符串 * @param s * @return */public static String strTo16(String s) {    String str = "";    for (int i = 0; i < s.length(); i++) {        int ch = (int) s.charAt(i);        String s4 = Integer.toHexString(ch);        str = str + s4;    }    return str;}

  *16进制转为字符串

/** * 16进制转换成为string类型字符串 * @param s * @return */public static String hexStringToString(String s) {	if (s == null || s.equals("")) {		return null;	}	s = s.replace(" ", "");	byte[] baKeyword = new byte[s.length() / 2];	for (int i = 0; i < baKeyword.length; i++) {		try {			baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));		} catch (Exception e) {			e.printStackTrace();		}	}	try {		s = new String(baKeyword, "UTF-8");		new String();	} catch (Exception e1) {		e1.printStackTrace();	}	return s;}

  *Unicode转为字符串

/** * unicode 转字符串 */public static String unicode2String(String unicode) {	StringBuffer string = new StringBuffer();	String[] hex = unicode.split("\\\\u");	for (int i = 1; i < hex.length; i++) {		// 转换出每一个代码点		int data = Integer.parseInt(hex[i], 16);		// 追加成string		string.append((char) data);	}	return string.toString();}

 

此方法虽然解决了转化过程中中文乱码的问题,但是过于复杂,笔者后来又发现一种新的转化方式,可直接转化,中文不乱码,代码如下:

  *字符串转16进制

/** * 字符串转换成为16进制(无需Unicode编码) * @param str * @return */public static String str2HexStr(String str) {	char[] chars = "0123456789ABCDEF".toCharArray();	StringBuilder sb = new StringBuilder("");	byte[] bs = str.getBytes();	int bit;	for (int i = 0; i < bs.length; i++) {		bit = (bs[i] & 0x0f0) >> 4;		sb.append(chars[bit]);		bit = bs[i] & 0x0f;		sb.append(chars[bit]);		// sb.append(' ');	}	return sb.toString().trim();}

  *16进制转为字符串

/** * 16进制直接转换成为字符串(无需Unicode解码) * @param hexStr * @return */public static String hexStr2Str(String hexStr) {	String str = "0123456789ABCDEF";	char[] hexs = hexStr.toCharArray();	byte[] bytes = new byte[hexStr.length() / 2];	int n;	for (int i = 0; i < bytes.length; i++) {		n = str.indexOf(hexs[2 * i]) * 16;		n += str.indexOf(hexs[2 * i + 1]);		bytes[i] = (byte) (n & 0xff);	}	return new String(bytes);}

  

 

转载于:https://www.cnblogs.com/carryLess/p/6889378.html

你可能感兴趣的文章
ios开发之--打印bool值
查看>>
打表找规律猜想是一种很好用的刷题技巧,写短码有用
查看>>
C# 加密术
查看>>
Java对象初始化详解
查看>>
Vue.js基础语法(二)组件
查看>>
常用的用户界面样式
查看>>
[转]MPI--MPI+VS2010 配置及编译
查看>>
L171
查看>>
nodeJS之HTTP
查看>>
poj2748
查看>>
poj2546
查看>>
windows运维如何批量远程桌面
查看>>
DB2 数据库的安装配置及监控
查看>>
IIS应用程序扩展名映射中无法添加“.svc”的问题
查看>>
ssd存储的SLC、MLC、TLC闪存芯片颗粒有什么区别?
查看>>
「小程序JAVA实战」小程序的flex布局(22)
查看>>
maven项目没有错,但是在项目头上有红叉的解决方法
查看>>
Hibernate注解与JPA
查看>>
34.Intellij IDEA 安装lombok及使用详解
查看>>
Educational Codeforces Round 26 - A, B, C 思维
查看>>