Java 16进制报文转换中英文报文(通过字节转换)

C语言的16进制转成中文输出 亲测好用,经过使用vs2019测试,utf8编码、gb2312编码均能实现中文转化输出,中文是“中国人”。如果使用utf8编码控制台输出是乱码,说明终端不支持,需要在终端安装utf8编码安装包,可参考另外一篇文章。//内容是“中国人”三个字。// UTF-8编码的汉字。int char2num(char ch) /*将字符转成数字*/// 将UTF-8编码的汉字转换为十六进制字符串。// 将十六进制字符串转换回UTF-8编码的汉字。 阅读详情

最近在搞这个16进制报文,网上找了很多地方,解出来的结果不是乱码就是报错,干脆自己写了。

大概是这样的,16进制的报文大家都知道是什么样子 例如:

3C E4 BA A4 E6 98 93 E6 88 90 E5 8A 9F EF BC 81 3E 20 3C 42 61 6B 31 2F 3E

因为其中包含有中文,所以使用常规的强转的话是不成功的,会出现乱码,头开始一直以为是编码的问题,结果发现并不是,太坑了 。

相较于这种,考虑到这些字符都可以转换成字节形式,通过字节byte这个媒介,可以进行16进制和报文的转换。

这个是单个16进制字符的转换

/**
     * @Author 宇智波波奶茶
     * @param inHex
     * @return byte
     */
    public static byte hexToByte(String inHex){
        return (byte) Integer.parseInt(inHex,16);
    }

如果想转换长串的话,就需要得到byte类型的数组了

    /**
     * @Author 宇智波波奶茶
     * @param inHex
     * @return byte[]
     */
    public static byte[] hexToByteArr(String inHex){
        inHex = inHex.replaceAll(" ","").replaceAll("\n","");
        int hexlen = inHex.length();
        byte[] result;
        if (hexlen % 2 == 1){
            hexlen ++;
            inHex = "0" + inHex;
            result = new byte[(hexlen/2)];
        } else {
            result = new byte[(hexlen/2)];
        }
        int j = 0;
        for (int i = 0; i < hexlen; i+=2) {
            result[j] = hexToByte(inHex.substring(i,i+2));
            j++;
        }
        return result;
    }

最后可以通过得到的byte数组,通过String构造方法,根据原有报文的编码格式,转化为字符串

    public void test(){
        String hexStr = "3C E4 BA A4 E6 98 93 E6 88 90 E5 8A 9F EF BC 81 3E 20 3C 42 61 6B 31 2F 3E";
        byte[] bytes = hexToByteArr(hexStr);
        String s = new String(bytes, StandardCharsets.UTF_8);
        System.out.printf("16进制报文为:%s\n转为报文为:%s",hexStr,s);
    }

接下来是 中英文报文转16进制的方法

/**
     * @Author 宇智波波奶茶
     * @param inHex
     * @return byte[]
     */
    public static String strToHex(String s){
        byte[] bt = s.getBytes();
        StringBuilder s1 = new StringBuilder();
        for (int i = 0; i < bt.length; i++) {
            String tempStr = Integer.toHexString(bt[i]);
            if (tempStr.length() > 2){
                tempStr = tempStr.substring(tempStr.length() - 2);
            }
            if (tempStr.length() < 2){
                tempStr = "0" + tempStr;
            }
            s1.append(tempStr);
        }
        return  s1.toString().toUpperCase();
    }

最后结果打印出来

解决Java中文乱码问题的原因与方法 通过正确设置字符编码、使用正确的输入输出流和工具类,以及确保数据库编码一致,可以有效地解决中文乱码问题。Java中的字符串是以Unicode编码方式存储的,而在输入、输出或者传输过程中,如果使用了不同的编码方式,就可能导致中文乱码问题的出现。然而,有时候在处理中文字符时会出现乱码问题,即显示的字符与预期的字符不一致。如果在Java程序中涉及到与数据库的交互,确保数据库的编码与Java程序的编码一致。确保在读取或写入文件、网络传输或数据库操作等场景中,使用正确的字符编码,避免出现中文乱码问题。 阅读详情

相关推荐

java十六进制、英文、中文转换

java中对于电子卡数据的读取,一般情况下,只可以读写英文字符。通过这段代码,可以将读出的英文字符转化为中文字符,以实现中、英文读写。

java 16进制字符串转为汉字

【代码】jva 16进制字符串转为汉字。

qq_35699674的博客 3362

Ubuntu环境下rknn-toolkit2的安装与兼容性解析

本文详细解析了在Ubuntu系统上安装瑞芯微rknn-toolkit2工具链的完整流程与关键注意事项。文章重点剖析了rknn-toolkit2与旧版rknn-toolkit的核心兼容性问题,强调两者在API、模型格式及运行时库上互不兼容,并推荐使用Conda虚拟环境进行隔离管理,为RK3566、RK3588等开发板的AI模型部署提供清晰的实践指南。

weixin_29041767的博客 375

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

/** * 16进制直接转换成为字符串(无需Unicode解码) * @param hexStr Byte字符串(Byte之间无分隔符 * @author xxs * @return 对应的字符串 */ public static String hexStr2Str(String hexStr) { String str = "0123456789ABCDEF"; /...

qq_43560721的博客 1万+

告别SendKeys!用DD驱动级模拟在Windows 10/11上实现真·后台键鼠操作(Python实战)

本文详细介绍了如何使用DD驱动级模拟技术在Windows 10/11上实现真后台键鼠操作,解决传统方法如pyautogui和SendKeys的局限性。通过Python实战案例,展示了驱动级模拟在游戏自动化、RPA等场景中的高效应用,包括环境配置、核心API解析及高级优化技巧。

weixin_42519985的博客 803

Python+QMT量化交易实战:从零搭建你的第一个极速策略(附完整代码)

本文提供了一份详细的Python+QMT量化交易实战指南,手把手教你从零搭建一个可回测、可实盘的极速策略。内容涵盖环境配置、QMT核心机制解析、双均线策略的完整代码实现、回测优化方法以及实盘部署要点,帮助量化交易新手快速入门并掌握核心开发流程。

b9c0d的博客 1014

java二进制转byte数组_Java中二进制16进制与字节数组之间的转换 | 学步园

首先说一下ByteBuffer 这个抽象类,一般在服务器和客户端之间的通信他们之间的通信格式都是固定的,都有消息头和消息体,也就是我们常说的自定义通信协议(都是基于TCP/IP层) 每个消息头和消息体都有固定的属性(也就是比如说:消息头有20个字节,前十个字节表示消息长度,后十个字节表示消息类型,这个消息长度和消息类型就是所说的属性) 每次客户端和服务端之间的通信消息都是按照这样的固定格式互相发送...

weixin_33883104的博客 1797

OpenClaw实战-行政与HR必备:AI驱动的办公自动化

智能会议纪要自动生成会议时间智能协调自动提醒和跟进简历智能筛选和匹配度分析面试安排自动化入职办理流程化通知公告一键发布发票识别和报销辅助资产管理数字化让AI处理繁杂的事务性工作,让您有更多时间专注于更有价值的战略和管理任务。

gaoxiang_120的专栏 220

java 数据类型和各类型的转换、进制的转换

java数据类型和各类型之间的转换,以及进制的转换 java的数据类型包括 基本数据类型 和 引用数据类型 。 java是一个强类型的编程语言。 所有的变量在第一次出现的时候 必须有数据类型。 面试题: java中的数据类型分为几种? 2种/无数种 2种指:基本数据类型、引用数据类型 无数种:引用数据类型是我们自定义的类,没有数量限制 基本数据类型 又称为简单数据类型[程序里面自带的...

THE_ZERO 898

基于经验模态分解和核主成分分析结合长短期记忆网络EMD-KPCA-LSTM的光伏功率预测算法--Matlab

基于经验模态分解和核主成分分析结合长短期记忆网络EMD-KPCA-LSTM的光伏功率预测算法--Matlab

前程算法屋的博客 626

AWR2243的等效相位中心与虚拟通道

在俯仰维方向上,不重合的虚拟通道有8个,排序为1:4,9:12。每个虚拟阵元之间的间隔为lambda/2。实际y轴方向虚拟阵列只跨越了8*lambda/2的距离。等效相位中心与虚拟通道类似,只是每个相位中心之间间隔为lambda/4,实际y轴方向等效相位中心只跨越了8*lambda/4=7.59mm的距离

qq_50974341的博客 1981

c语言中大写英文字母所占字节,Java中字符编码和字符串所占字节数 .

首 先,java中的一个char是2个字节。java采用unicode,2个字节来表示一个字符,这点与C语言中不同,C语言中采用ASCII,在大多数 系统中,一个char通常占1个字节,但是在0~127整数之间的字符映射,unicode向下兼容ASCII。而Java采用unicode来表示字符,一个中文或英文字符的unicode编码都占2个字节,但如果采用其他编码方式,一个字符占用的字节数则各不相...

weixin_31976493的博客 3287

通信原理 | python调制识别数据及代码

数据集包含了从-20dB 到+18dB 总共 20 个信噪比(步长为 2)下的 11 种调制信号, 包括 AM-DSB、 AM-SSB 和 WBFM 三种模拟调制信号,以及 BPSK、 QPSK、 8PSK、 CPFSK、 GFSK、 PAM4、 QAM16 和 QAM64 八种数字调制信号。其中信号的中心频率为 200KHz,采样频率为 1Msamp/s,且每个信噪比下每种调制信号包含 1000 个信号。其中每个信号包含 IQ 两路数据,且每一路数据都包含有 128 个采样点。

若北辰 1758

Java中基本类型字节数

一. java中基本类型占用字节数 1. 整型 类型 存储需求 bit数 取值范围 备注 int 4字节 4*8 -2147483648~2147483647 即 (-2)的31次方 ~ (2的31次方) - 1。 为什么是31而不是32?因为第一位是符号位,用来表示正负的 short 2字节 2*8 -32768...

weixin_37488561的博客 1294

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

java 中文转二进制_Java 实现中文与二进制代码互转

//将二进制字符串转化为中文import java.util.ArrayList;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern;//https://zhidao.baidu.com/question/417113915.htmlpublic class BinaryToStri...

weixin_27038701的博客 1452

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java中基本类型占字节数以及Uint32的意思

初学开发的时候(我的第一门语言是JAVA,android方向),基本很少考虑java中基本类型的占用字节数。 直到工作中接触到串口通讯,与单片机通讯,看着那些通讯文档,看着例如Uint16、Uint32、Uint64、Char(16)、Char(64)等等这些值类型的时候才发现一头雾水。 下面先讲讲java中的基本类型占用的字节数。文章最后再讲讲这些值类型的意思。 一. java中基本类型占用...

weixin_34090643的博客 2216

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java基础知识 02(常量,进制转换,原码、反码、补码,变量)

Java基础知识 02 常量 整数 小数 字符常量:单引号引起的单个字符(中英文都行) 字符串常量:双引号引起来的多个字符(中英文都行) 布尔常量:true,false null(空常量) class ConstantDemo{ public static void main(String[] args) { //输出字符串常量 System.out.println("Hel...

骑着蜗牛行天下 329

java中char的类型范围,Java中基本类型占字节数以及Uint32的意思

初学开发的时候(我的第一门语言是JAVA,android方向),基本很少考虑java中基本类型的占用字节数。 直到工作中接触到串口通讯,与单片机通讯,看着那些通讯文档,看着例如Uint16、Uint32、Uint64、Char(16)、Char(64)等等这些值类型的时候才发现一头雾水。下面先讲讲java中的基本类型占用的字节数。文章最后再讲讲这些值类型的意思。一. java中基本类型占用字节数1...

weixin_28728031的博客 765

java中bitconverter_C#中BitConverter.ToUInt16()和BitConverter.ToString()的简单使用

下面是msdn中的一个例子,在我刚看到这里例子时,该例子有三点是我可以学到的。第一:排列格式。如:定义一个常量变量const string a="{0,11}{1,10},{2,7}"; 这样一个格式用来排列三个变量的位置,第一个变量占5个位置,第二个变量占8个位置,第三个变量占10个位置。中英文都算一个位置。比如在控制台上输出 Console.WriteLine(a,"以后想找什么当另外一半...

weixin_29571873的博客 1445

java utf8 byte_byte以及UTF-8的转码规则

https://www.cnblogs.com/hell8088/p/9184336.html多年来闲麻烦,只记录笔记,不曾编写BLOG,本文为原创,如需转载请标明出处废话不说,直奔主题ascii计算机只接受 “高”、“低”电压,所以使用二进制 1 和 0 分别代表高低电压ascii 将 “字符”和“符号”转为二进制,在通过二进制转为电压让计算机识别0-127 是 7 位ASCII 码的范...

weixin_33349121的博客 4373

Java基础——常量与变量&进制转换法&GBK编码环境下如何编译utf-8编码的文件

Java基础——常量与变量&进制转换法&GBK编码环境下如何编译utf-8编码的文件 文章目录Java基础——常量与变量&进制转换法&GBK编码环境下如何编译utf-8编码的文件常量字面值常量在代码中输出不同的常量进制法(仔细总结进制换算法)进制转换任意进制到10进制(位权展开法)十进制到任意进制原码,反码,补码(计算机底层在运算时是通过补码运算的)例题变量数据类型...

adAir_liu的博客 1312

一个汉字几个字符?几个字节?字符与字节关系傻傻分不清

一个汉字一个字符!不信你去java输入char ch = '汉’看看报不报错 学习java也有段时间了,一直都是毛里毛糙的学习,但都是停留在略懂阶段,似乎会,实际上差得远了,,还是要沉下来心一点一点学呀,慢慢积累,不怕慢,对一个知识点彻底明白了会感觉收获颇多,走马观花地学总感觉空落落的。 先说编码 计算机存放数据只能存放数字(几进制的那种),所有的字符都会被转换为不同的数字。 英文、中文都是数据,一个汉字一个字母都是一个字符,但计算机读取时会转化为字节,一般情况下英文字母占一个字节,使用ISO-8859-1

时光如白驹过隙的博客 2万+

Java字节流与字符流核心笔记(问答+考点复盘)

本笔记围绕字节流、字符流、编码转换、中文传输、底层原理展开,全程还原问答逻辑,梳理易混点、核心考点和易错坑,适配Java IO基础复盘与面试备考。目录前言一、基础核心问答(直击疑问)Q1:字节流一次读一个字节,为什么read()能直接读出字符'a'?Q2:Java的char和文本文档里的字符,字节占用为啥不一样?Q3:两边字节标准不一致,会不会导致内容解析出错?Q4:String的toCharArray()和getBytes()有啥区别?

2401_83135864的博客 415

Java的字节流和字符流

Java中的字节流和字符流

AboutChristina的专栏 555

java的中英文编码测试代码

public static String bytesToHexStringPrint(byte[] bArray){ if(bArray == null || bArray.length == 0){ return null; } StringBuffer sb = new StringBuffer(bArray.length); String sTemp; for (int i =

shareinfo2018 751
上一篇: npm install 失败 node-sass的问题
下一篇: VUE实现长时间未操作退出登录
宇智波波奶茶
博客等级 码龄7年 3095粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇智波波奶茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值