十六进制字符串与中文互转
前言:有时候在做数据分析的时候会遇到一些二进制数据文件或者在进行tcp/udp通信的时候经常需要把数据转化成字节数据,其中包含了中文数据,但网上查找半天不知道怎么去解析这些数据变成我们想要的,所以在这里就记录下一些常用的方法。
目录
实现语言:Java、Python
一、Java实现方法
首先是常用的编码列表,下面的有些方法的参数会用到。(ps:有些方法描述不恰当,结果一般是正确的)
序号 | 编码名称 | 说明 |
---|---|---|
1 | US-ASCII | 7 位 ASCII 字符,也叫作 ISO646-US、Unicode 字符集的基本拉丁块 |
2 | ISO-8859-1 | ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1 |
3 | UTF-8 | 8 位 UCS 转换格式 |
4 | UTF-16BE | 16 位 UCS 转换格式,Big Endian(最低地址存放高位字节)字节顺序 |
5 | UTF-16LE | 16 位 UCS 转换格式,Little-endian(最高地址存放低位字节)字节顺序 |
6 | UTF-16 | 16 位 UCS 转换格式,字节顺序由可选的字节顺序标记来标识 |
(1)字符串转16进制字符串
/**
* 字符串转16进制字符串
* @param str 普通字符串
* @param charsetName 编码名称
* @return 16进制字符串
*/
public static String StringToHexStr(String str,String charsetName){
try {
byte[] conver=str.getBytes(charsetName);
StringBuilder sb = new StringBuilder();
for(int i=0;i<conver.length;i++) {
sb.append(String.format("%02x",conver[i]));
}
return sb.toString();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
说明:该方法比较常用。
调用例子:HexDataUtils.StringToHexStr("中文abc123", "UTF-16LE")
结果:2d4e8765610062006300310032003300
(2)字符串转字节数组
/**
* 字符串转字节数组
* @param str 普通字符串
* @param charsetName 编码名称
* @return 字节数组
*/
public static byte[] StringToByteArray(String str,String charsetName){
try {
return str.getBytes(charsetName);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
调用例子:HexDataUtils.StringToByteArray("中文abc123", "UTF-16LE")
结果:[B@282ba1e
结果(Arrays.toString() 执行后):[45, 78, -121, 101, 97, 0, 98, 0, 99, 0, 49, 0, 50, 0, 51, 0]
(3)字节数组转16进制字符串
/**
* 字节数组转16进制字符串
* @param b 字节数组
* @return 十六进制字符串
*/