十六进制字符串与中文互转

前言:有时候在做数据分析的时候会遇到一些二进制数据文件或者在进行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

十六进制字符串与中文互转相关推荐

  1. java十六进制字符串和中文(字符串)互转以及转换乱码问题总结

    /*** 16进制直接转换成为字符串(无需Unicode解码)* @param hexStr Byte字符串(Byte之间无分隔符* @author xxs* @return 对应的字符串*/publ ...

  2. 1.3 Codesys十六进制数字字符串与字节互转

    1.十六进制数字字符串转换成字节,不包含前缀'16#',例如字符串'EE',转换后得数字16#EE(十进制显示为238),具体功能代码如下: FUNCTION strHex_To_Byte : BYT ...

  3. Java byte数组与十六进制字符串互转

    Java byte数组与十六进制字符串互转 博客分类: Java Javajava 十六进制java hex Java 加密解密基础 Java byte数组与十六进制字符串互转 Java BASE64 ...

  4. UIColor与十六进制字符串互转

    UIColor转十六进制字符串方法一:经过测试发现部分颜色会转化为#fffff(五个f),转化残缺导致最后颜色无法还原,不推荐使用.// UIColor转#ffffff格式的字符串 + (NSStri ...

  5. VB 二进制数组与十六进制字符串相互转换

    1.VB 二进制Byte()数组转换成十六进制字符串函数: Private Function BytesToHex(bytB() As Byte) As String Dim strTmp As St ...

  6. Python中字符串和二进制互转

    Python中字符串和二进制互转 最近在搞图形相关的东西,有时候操作涉及到每个 比特 的操作,所以必须实现一个方法(将字符串二值化),就是把字符串转换成为二进制形式.搜索了一些相关的实现,但是本篇只对 ...

  7. c语言的十进制转十六进制字符串,用c语言写一个函数把十进制转换成十六进制,该如何处理...

    用c语言写一个函数把十进制转换成十六进制 用c语言写一个函数把十进制转换成十六进制 网上找到一些,感觉有占乱 分享到: ------解决方案-------------------- #include ...

  8. python关于解决‘\u‘开头的字符串转中文的方法

    python关于解决'\u'开头的字符串转中文的方法 参考文章: (1)python关于解决'\u'开头的字符串转中文的方法 (2)https://www.cnblogs.com/Lee-yl/p/1 ...

  9. python: 关于解决‘\u‘开头的字符串转中文的方法

    python: 关于解决'\u'开头的字符串转中文的方法 参考文章: (1)python: 关于解决'\u'开头的字符串转中文的方法 (2)https://www.cnblogs.com/hahaxz ...

最新文章

  1. TFTP、RAM、NVRAM之间的关系
  2. 如何提高软件可维护性
  3. Android插件化(使用Small框架)
  4. python_循环删除list中的元素,有坑啊!
  5. Docker实践,来自沪江、滴滴、蘑菇街架构师的交流分享
  6. harmonyos sdk,HarmonyOS SDK对应的API版本跃迁引发的历史工程适配问题解决方案
  7. C++设计模式-AbstractFactory抽象工厂模式
  8. C#上传文件的一个实现
  9. 小米盒子显示gitv不动_2020电视盒子排行榜,五款“真香”盒子报到
  10. R语言中的数据处理包dplyr、tidyr笔记
  11. Linux学习笔记之查看Linux版本信息
  12. 程序员,保险公司招聘不要轻易跑过去,省省路费省省时间,别浪费感情,特别是招聘什么业务主管经理的...
  13. NYOJ 588 Money
  14. 企业品牌营销型网站搭建需要关注这6大核心要素
  15. 伪原创内容来源的八个渠道
  16. 自学c语言困难吗,你觉得这4块是C语言最难学的部分吗?
  17. APP全栈工程师修炼之路(三)
  18. honor荣耀为什么要研发高端?
  19. 微信开发------------公众号支付统一下单整个流程
  20. stm32H70之使用片内的2Mflash

热门文章

  1. 分类模型评估之ROC-AUC
  2. 基于CentOS平台的Snort+Barnyard安装步骤
  3. 物联网传输技术——ZigBee协议概论
  4. 《个人相册》项目相册页面(HTML+CSS+JS)
  5. Vuex中的state属性详解
  6. ProE二次开发 Creo二次开发 自定义零件库
  7. JavaScript权威指南(第6版)
  8. Linux_进程间通信(详解)
  9. java iterator 删除_Java集合使用 Iterator 删除元素
  10. yzm10的ACM集训小感