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

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

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

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

2)相反的,在十六进制转换为字符串后的得到的是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);

}

下面是补充

java字符串和十六进制字符串互转

public class HexStringUtils {

private static final char[] DIGITS_HEX = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',

'E', 'F' };

protected static char[] encodeHex(byte[] data) {

int l = data.length;

char[] out = new char[l << 1];

for (int i = 0, j = 0; i < l; i++) {

out[j++] = DIGITS_HEX[(0xF0 & data[i]) >>> 4];

out[j++] = DIGITS_HEX[0x0F & data[i]];

}

return out;

}

protected static byte[] decodeHex(char[] data) {

int len = data.length;

if ((len & 0x01) != 0) {

throw new RuntimeException("字符个数应该为偶数");

}

byte[] out = new byte[len >> 1];

for (int i = 0, j = 0; j < len; i++) {

int f = toDigit(data[j], j) << 4;

j++;

f |= toDigit(data[j], j);

j++;

out[i] = (byte) (f & 0xFF);

}

return out;

}

protected static int toDigit(char ch, int index) {

int digit = Character.digit(ch, 16);

if (digit == -1) {

throw new RuntimeException("Illegal hexadecimal character " + ch + " at index " + index);

}

return digit;

}

public static String toHex(String str) {

return new String(encodeHex(str.getBytes()));

}

public static String fromHex(String hex) {

return new String(decodeHex(hex.toCharArray()));

}

public static void main(String[] args) {

String s = "abc你好";

String hex = toHex(s);

String decode = fromHex(hex);

System.out.println("原字符串:" + s);

System.out.println("十六进制字符串:" + hex);

System.out.println("还原:" + decode);

}

}

toHexString

public static String toHexString(int i)以十六进制的无符号整数形式返回一个整数参数的字符串表示形式。

如果参数为负,那么无符号整数值为参数加上 232;否则等于该参数。将该值转换为十六进制(基数 16)的无前导 0 的 ASCII 数字字符串。如果无符号数的大小值为零,则用一个零字符 '0' ('\u0030') 表示它;否则,无符号数大小的表示形式中的第一个字符将不是零字符。用以下字符作为十六进制数字:

0123456789abcdef

这些字符的范围是从 '\u0030' 到 '\u0039' 和从 '\u0061' 到 '\u0066'。如果希望得到大写字母,可以在结果上调用 String.toUpperCase() 方法:

Integer.toHexString(n).toUpperCase()

参数:

i - 要转换成字符串的整数。

返回:

用十六进制(基数 16)参数表示的无符号整数值的字符串表示形式。

// 转化字符串为十六进制编码

public static String toHexString(String s)

{

String str="";

for (int i=0;i

{

int ch = (int)s.charAt(i);

String s4 = Integer.toHexString(ch);

str = str + s4;

}

return str;

}

// 转化十六进制编码为字符串

public static String toStringHex(String s)

{

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");//UTF-16le:Not

}

catch (Exception e1)

{

e1.printStackTrace();

}

return s;

}

// 转化十六进制编码为字符串

public static String toStringHex(String s)

{

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");//UTF-16le:Not

}

catch (Exception e1)

{

e1.printStackTrace();

}

return s;

}

public static void main(String[] args) {

System.out.println(encode("中文"));

System.out.println(decode(encode("中文")));

}

/*

* 16进制数字字符集

*/

private static String hexString="0123456789ABCDEF";

/*

* 将字符串编码成16进制数字,适用于所有字符(包括中文)

*/

public static String encode(String str)

{

//根据默认编码获取字节数组

byte[] bytes=str.getBytes();

StringBuilder sb=new StringBuilder(bytes.length*2);

//将字节数组中每个字节拆解成2位16进制整数

for(int i=0;i

{

sb.append(hexString.charAt((bytes[i]&0xf0)>>4));

sb.append(hexString.charAt((bytes[i]&0x0f)>>0));

}

return sb.toString();

}

/*

* 将16进制数字解码成字符串,适用于所有字符(包括中文)

*/

public static String decode(String bytes)

{

ByteArrayOutputStream baos=new ByteArrayOutputStream(bytes.length()/2);

//将每2位16进制整数组装成一个字节

for(int i=0;i

baos.write((hexString.indexOf(bytes.charAt(i))<<4 |hexString.indexOf(bytes.charAt(i+1))));

return new String(baos.toByteArray());

}

第二种方法:

将指定byte数组以16进制的形式打印到控制台

package com.nantian.iclient.atm.sdb;

public class Util {

public Util() {

}

/**

* 将指定byte数组以16进制的形式打印到控制台

* @param hint String

* @param b byte[]

* @return void

*/

public static void printHexString(String hint, byte[] b) {

System.out.print(hint);

for (int i = 0; i < b.length; i++) {

String hex = Integer.toHexString(b[i] & 0xFF);

if (hex.length() == 1) {

hex = '0' + hex;

}

System.out.print(hex.toUpperCase() + " ");

}

System.out.println("");

}

/**

*

* @param b byte[]

* @return String

*/

public static String Bytes2HexString(byte[] b) {

String ret = "";

for (int i = 0; i < b.length; i++) {

String hex = Integer.toHexString(b[i] & 0xFF);

if (hex.length() == 1) {

hex = '0' + hex;

}

ret += hex.toUpperCase();

}

return ret;

}

/**

* 将两个ASCII字符合成一个字节;

* 如:"EF"--> 0xEF

* @param src0 byte

* @param src1 byte

* @return byte

*/

public static byte uniteBytes(byte src0, byte src1) {

byte _b0 = Byte.decode("0x" + new String(new byte[]{src0})).byteValue();

_b0 = (byte)(_b0 << 4);

byte _b1 = Byte.decode("0x" + new String(new byte[]{src1})).byteValue();

byte ret = (byte)(_b0 ^ _b1);

return ret;

}

/**

* 将指定字符串src,以每两个字符分割转换为16进制形式

* 如:"2B44EFD9" --> byte[]{0x2B, 0x44, 0xEF, 0xD9}

* @param src String

* @return byte[]

*/

public static byte[] HexString2Bytes(String src){

byte[] ret = new byte[8];

byte[] tmp = src.getBytes();

for(int i=0; i<8; i++){

ret[i] = uniteBytes(tmp[i*2], tmp[i*2+1]);

}

return ret;

}

}

以上就是JAVA 十六进制与字符串的转换的详细内容,更多关于JAVA 十六进制的资料请关注脚本之家其它相关文章!

java 16进制_JAVA 十六进制与字符串的转换相关推荐

  1. java 16进制_JAVA十六进制数据接收与传输

    由于项目中经常遇到与设备进行交互获取数据,不仅有Python版本.还有Java版本,还可能会有C#版本,在此做个记录. 一.十六进制转换工具类 主要包含十六进制字符串转ASCII,ASCII转十六进制 ...

  2. python字符串转16进制_Python十六进制与字符串的转换

    电脑上装了Python2.7和3.3两个版本,平时运行程序包括在Eclipse里面调试都会使用2.7,但是由于某些原因在cmd命令行中输入python得到的解释器则是3.3, 一直没对此做处理,因为这 ...

  3. java byte转16进制_Java 十六进制(Hex)与byte数组之间的转换

    一.十六进制(Hex)与字节(byte)的概念 十六进制(Hex):计算机中数据的一种表示方法,它由0-9,A-F组成,字母不区分大小写.与10进制的对应关系是:0-9对应0-9:A-F对应10-15 ...

  4. java 字节 16进制_Java字节数组和16进制字符串的互相转化

    背景基础知识: 1.1. "字符"是由数字来表示的 先来重新了解一下计算机是如何处理"字符"的,这个原理是大家必须记住的,特别是在用JAVA写程序的时候,万万不 ...

  5. java 16进制字符转10进制_java 16进制字符串怎么转换成10进制字符串

    展开全部 toHexString public static String toHexString(int i)以十六进制的无符号整数形式返回一个整数参数的字符串表示形式. 如果参数为负,那么无符号整 ...

  6. 字符串转16进制和16进制数字解码成字符串的方法 ,适用于所有字符(包括中文)

    package com.test;import java.io.ByteArrayOutputStream;public class Test {public static void main(Str ...

  7. C语言快速互转HEX(16进制)和原始字符串/数组

    C语言快速互转HEX(16进制)和原始字符串/数组 缘由 这个起因是昨晚群里有人在讨论怎么把字符串转成HEX方法最佳,讨论到最后变成哪种方法效率最优了.毕竟这代码是要在MCU上面跑的,要同时考虑到时间 ...

  8. java 16进制 累加,java 16进制求和示例

    java 16进制求和,也就是16进制字节求二进制和,自己写的逻辑有点问题,不能满足需求,故从网上搜了下,满足了需求,代码如下public class Jinzhi16Util { public St ...

  9. java 16进制转成字符串_java 16进制转成字符串

    java 将十六进制转化成字符串方法: public static String toStringHex(String s) { byte[] baKeyword = new byte[s.lengt ...

  10. java long转16进制_java 16进制与10进制等转换 | 学步园

    /十进制转16进制 String s = "16"; String _hex = Integer.toHexString(Integer.parseInt(s)); System. ...

最新文章

  1. 吴恩达灵魂发问:AI社区最亟待解决的问题是什么?
  2. SCImago Journal Rank:微生物领域期刊综合评价指标排名
  3. BT:大豆皮堆肥过程中的物质转化、微生物群落组成和代谢功能演替
  4. 杨强:人工智能在企业的落地是一门大学问
  5. 待办事项桌面插件_求一款安卓手机上可添加小目标的桌面便签软件?
  6. 用原生JS实现旋转轮播图
  7. java 集合 延迟加载_java-如何测试延迟加载的JPA集合是否已初始化?
  8. 解决vista/win7安装windows live messenger 2011找不到wlidcli.dll及错误800488eb .
  9. 如何使用 Linq 获取每个分组中的第一个元素?
  10. VC6 CImage 加载jpg png bmp
  11. p2p-如何拯救k8s镜像分发的阿喀琉斯之踵?
  12. react和nodejs_如何使用React,TypeScript,NodeJS和MongoDB构建Todo应用
  13. group() 数组java_java 根据每个分组个数,分解数组. | 学步园
  14. html span离div块有边距,html块 div span
  15. freebsd 自动启动服务器,教程/FreeBSD启动脚本
  16. 使用Quartz.Net定时删除Log
  17. 五邑大学计算机学院奖学金,关于开展2019-2020学年度学生综合测评和奖学金评定工作的通知...
  18. Win10数字小键盘按键变成方向键怎么办?Win10数字小键盘按键变为方向键解决方法
  19. 阿拉尔市谷歌高清卫星地图下载
  20. ssh开启图形界面_xwindow——远程启动linux的图形界面

热门文章

  1. 步进电机和伺服驱动器接线
  2. Linux环境运行jmeter+测试报告查看
  3. fceux模拟器linux,FCEUX模拟器
  4. Ubuntu安装MDK5
  5. vs2019的nmake和cvtres异常
  6. MODIS数据下载及批处理
  7. esp8266教程:smartconfig智能配网
  8. idea 主题设计+网站
  9. SpringJDK动态代理实现
  10. Python 正则表达式_re模块_使用compile加速