十六进制字符串与中文互转
十六进制字符串与中文互转
前言:有时候在做数据分析的时候会遇到一些二进制数据文件或者在进行tcp/udp通信的时候经常需要把数据转化成字节数据,其中包含了中文数据,但网上查找半天不知道怎么去解析这些数据变成我们想要的,所以在这里就记录下一些常用的方法。
目录
十六进制字符串与中文互转
一、Java实现方法
(1)字符串转16进制字符串
(2)字符串转字节数组
(3)字节数组转16进制字符串
(4)字节数组转字符串
(5)16进制字符串转字节数组
(6)16进制字符串转字符串
(7)整数转字节数组
(8)整数转16进制字符串
(9)字节数组转整数
(10)十六进制字符串转整数
二、python实现方法
实现语言: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 十六进制字符串*/public static String ByteArrayToHexStr(byte[] b){StringBuilder sb = new StringBuilder();for (byte con : b) {sb.append(String.format("%02x", con));}return sb.toString();}
调用例子:byte[] b= {45, 78, -121, 101, 97, 0, 98, 0, 99, 0, 49, 0, 50, 0, 51, 0}
HexDataUtils.ByteArrayToHexStr(b)
结果:2d4e8765610062006300310032003300
(4)字节数组转字符串
/*** 字节数组转字符串* @param b 字节数组* @param charsetName 编码名称* @return 普通字符串*/public static String ByteArrayToSting(byte[] b,String charsetName){String str = null;try {str = new String(b,charsetName);} catch (UnsupportedEncodingException e) {e.printStackTrace();}return str;}
调用例子:byte[] b= {45, 78, -121, 101, 97, 0, 98, 0, 99, 0, 49, 0, 50, 0, 51, 0}
HexDataUtils.ByteArrayToSting(b,"UTF-16LE")
结果:中文abc123
(5)16进制字符串转字节数组
/*** 16进制字符串转字节数组* @param hexStr 16进制字符串* @return 字节数组*/public static byte[] HexStrToByteArray(String hexStr){int strLen=hexStr.length();if (strLen % 2 !=0) {return null;}byte[] conver = new byte[strLen/2];;for (int i = 0; i < strLen; i++) {if (i%2==0){conver[i/2] = (byte)Integer.parseInt(hexStr.substring(i,i+2),16);}}return conver;}
调用例子:HexDataUtils.HexStrToByteArray("2d4e8765610062006300310032003300")
结果(Arrays.toString() 执行后):[45, 78, -121, 101, 97, 0, 98, 0, 99, 0, 49, 0, 50, 0, 51, 0]
(6)16进制字符串转字符串
/*** 16进制字符串转字符串* @param hexStr 16进制字符串* @param charsetName 编码名称* @return 普通字符串*/public static String HexStrToSting(String hexStr,String charsetName){byte[] conver = HexStrToByteArray(hexStr);return ByteArrayToSting(conver,charsetName);}
说明:这个方法是一个比较常用的方法,经常会用到,其中用到(5)里面的16进制字符串转字节数组HexStrToByteArray这个方法。
调用例子:HexDataUtils.HexStrToSting("2d4e8765610062006300310032003300", "UTF-16LE")
结果:中文abc123
(7)整数转字节数组
/*** 整数转字节数组* @param num 需要转化的整数* @param size 转化字节大小* @param order 字节顺序* @return 字节数组*/public static byte[] IntToByteArray(int num,int size,String order){byte[] conver = new byte[size];if ("little".equals(order)){// 低字节序for (int i = 0; i < size; i++) {conver[i] = (byte) (num >> i*8 & 0xff);}}else if ("big".equals(order)){// 高字节序for (int i = 0; i < size; i++) {conver[size-(i+1)] = (byte) (num >> i*8 & 0xff);}}else {return null;}return conver;}
调用例子:HexDataUtils.IntToByteArray(101, 4,"big")
结果:当我们再次(3)字节数组转16进制字符串ByteArrayToHexStr时结果为:00000065
(8)整数转16进制字符串
/*** 整数转16进制字符串* @param num 待转整数* @param size 字节大小* @param order 字节顺序* @return 16进制字符串*/public static String IntToHexStr(int num,int size,String order){byte[] conver = IntToByteArray(num,size,order);return ByteArrayToHexStr(conver);}
说明:用到(7)里面的整数转字节数组IntToByteArray这个方法。
调用例子:HexDataUtils.IntToHexStr(101,4,"big")
结果:00000065
(9)字节数组转整数
/*** 字节数组转整数* @param b 待转字节数组* @param order 字节顺序* @return 整数*/public static int ByteArrayToInt(byte[] b,String order){int converNum;if("little".equals(order)){// 低字节序byte[] reverseArray = new byte[b.length];for (int i = 0; i < b.length; i++) {reverseArray[i] = b[b.length - i - 1];}String hexStr = ByteArrayToHexStr(reverseArray);converNum = Integer.parseInt(hexStr,16);return converNum;}else if ("big".equals(order)){// 高字节序String hexStr = ByteArrayToHexStr(b);converNum = Integer.parseInt(hexStr,16);return converNum;}return 0;}
说明:用到(3)里面的字节数组转16进制字符串ByteArrayToHexStr这个方法
调用例子:byte[] b= {127,126}
HexDataUtils.ByteArrayToInt(b,"big")
结果:32638
(10)16进制字符串转整数
public static int HexStrToInt(String hexStr,String order){byte[] conver = HexStrToByteArray(hexStr);return ByteArrayToInt(conver,order);}
说明:用到16进制字符串转字节数组HexStrToByteArray这个方法
调用例子:HexDataUtils.HexStrToInt("00000065","big")
结果:101
二、python实现方法
python实现这些方法要简单很多,就不单出列出来了。
说明:charsetName参数可选utf_16_le或utf_16_be。还可以选择其他参数如utf-8、GBK等。order参数可选big或little。16字符串作为参数时每个字节之间可以有空格,例如"1F 1A",不限大小写。
def StringToHex(text:str,charsetName:str):# 中文转16进制字符串return text.encode(encoding=charsetName).hex()def HexToString(textBytesFormat:str,charsetName:str):# 16进制字符串转中文return bytes.fromhex(textBytesFormat).decode(encoding=charsetName)def StringToBytes(text:str,charsetName:str):# 中文转byte类型return text.encode(encoding=charsetName)def HexToBytes(textBytesFormat:str):# 16进制转byte类型return bytes.fromhex(textBytesFormat)def IntToHexStr(num:int,length:int,order):# 整数转16进制字符串return num.to_bytes(length,order).hex()def HexStrToInt(text:str,order:str):# 16进制字符串转整数return int.from_bytes(bytes.fromhex(text),order)
调用结果:
调用例子 | 结果返回 |
---|---|
StringToHex("中文abc123","utf_16_le") |
2d4e8765610062006300310032003300 |
HexToString("2d4e8765610062006300310032003300","utf_16_le") | 中文abc123 |
StringToBytes("中文abc123","utf_16_le") | b'-N\x87ea\x00b\x00c\x001\x002\x003\x00' |
HexToBytes("2d4e8765610062006300310032003300") | b'-N\x87ea\x00b\x00c\x001\x002\x003\x00' |
IntToHexStr(101,4,"big") | 00000065 |
HexStrToInt("00000065","big") | 101 |
十六进制字符串与中文互转相关推荐
- java十六进制字符串和中文(字符串)互转以及转换乱码问题总结
/*** 16进制直接转换成为字符串(无需Unicode解码)* @param hexStr Byte字符串(Byte之间无分隔符* @author xxs* @return 对应的字符串*/publ ...
- 1.3 Codesys十六进制数字字符串与字节互转
1.十六进制数字字符串转换成字节,不包含前缀'16#',例如字符串'EE',转换后得数字16#EE(十进制显示为238),具体功能代码如下: FUNCTION strHex_To_Byte : BYT ...
- Java byte数组与十六进制字符串互转
Java byte数组与十六进制字符串互转 博客分类: Java Javajava 十六进制java hex Java 加密解密基础 Java byte数组与十六进制字符串互转 Java BASE64 ...
- UIColor与十六进制字符串互转
UIColor转十六进制字符串方法一:经过测试发现部分颜色会转化为#fffff(五个f),转化残缺导致最后颜色无法还原,不推荐使用.// UIColor转#ffffff格式的字符串 + (NSStri ...
- VB 二进制数组与十六进制字符串相互转换
1.VB 二进制Byte()数组转换成十六进制字符串函数: Private Function BytesToHex(bytB() As Byte) As String Dim strTmp As St ...
- Python中字符串和二进制互转
Python中字符串和二进制互转 最近在搞图形相关的东西,有时候操作涉及到每个 比特 的操作,所以必须实现一个方法(将字符串二值化),就是把字符串转换成为二进制形式.搜索了一些相关的实现,但是本篇只对 ...
- c语言的十进制转十六进制字符串,用c语言写一个函数把十进制转换成十六进制,该如何处理...
用c语言写一个函数把十进制转换成十六进制 用c语言写一个函数把十进制转换成十六进制 网上找到一些,感觉有占乱 分享到: ------解决方案-------------------- #include ...
- python关于解决‘\u‘开头的字符串转中文的方法
python关于解决'\u'开头的字符串转中文的方法 参考文章: (1)python关于解决'\u'开头的字符串转中文的方法 (2)https://www.cnblogs.com/Lee-yl/p/1 ...
- python: 关于解决‘\u‘开头的字符串转中文的方法
python: 关于解决'\u'开头的字符串转中文的方法 参考文章: (1)python: 关于解决'\u'开头的字符串转中文的方法 (2)https://www.cnblogs.com/hahaxz ...
最新文章
- TFTP、RAM、NVRAM之间的关系
- 如何提高软件可维护性
- Android插件化(使用Small框架)
- python_循环删除list中的元素,有坑啊!
- Docker实践,来自沪江、滴滴、蘑菇街架构师的交流分享
- harmonyos sdk,HarmonyOS SDK对应的API版本跃迁引发的历史工程适配问题解决方案
- C++设计模式-AbstractFactory抽象工厂模式
- C#上传文件的一个实现
- 小米盒子显示gitv不动_2020电视盒子排行榜,五款“真香”盒子报到
- R语言中的数据处理包dplyr、tidyr笔记
- Linux学习笔记之查看Linux版本信息
- 程序员,保险公司招聘不要轻易跑过去,省省路费省省时间,别浪费感情,特别是招聘什么业务主管经理的...
- NYOJ 588 Money
- 企业品牌营销型网站搭建需要关注这6大核心要素
- 伪原创内容来源的八个渠道
- 自学c语言困难吗,你觉得这4块是C语言最难学的部分吗?
- APP全栈工程师修炼之路(三)
- honor荣耀为什么要研发高端?
- 微信开发------------公众号支付统一下单整个流程
- stm32H70之使用片内的2Mflash