16进制转字符(ascii码16进制代码转换)

16进制转字符(ascii码16进制代码转换)作者| Java圣|原创图文,转载请注明出处。 全文约3000字(含代码),阅读需要10分钟。建议收藏。 大家好,欢迎关注Java圣斗士,每日编程课带你飞! 很多物联网或者通信行业的小伙伴,以及一些…

大家好,我是讯享网,很高兴认识大家。

作者| Java圣|原创图文,转载请注明出处。

全文约3000字(含代码),阅读需要10分钟。建议收藏。

大家好,欢迎关注Java圣斗士,每日编程课带你飞!

很多物联网或者通信行业的小伙伴,以及一些智能硬件领域,经常需要处理一些字节指令。有时,如果需要显示或存储这些字节指令,就需要将它们转换成十六进制指令串。所以今天我们就来讨论一下如何把一个字节数组转换成标准的十六进制字符串,看看大牛是怎么操作的。

一、如何实现byte数组转十六进制字符串

现在如果有一个字节数组如下:

byte[] org = {1,2,3,15,10,16,17,32,0,8 };想转换成十六进制:01 02 03 0F 0A 10 11 20 00 08,你会怎么实现?如果是普通代码,可能如下所示:

公共静态字符串byteArraytoHexString(byte[]b){ int iLen = b . length;string buffer sb = new string buffer(iLen * 2);for(int I = 0;我& ltiLeni++){ int int tmp = b[I];while(int tmp & lt;0){ int tmp = int tmp+256;} if(int tmp & lt;16){ sb . append(” 0 “);} sb . append(integer . tostring(int tmp,16));}return sb.toString()。toupper case();}主要测试程序:

public static void main(String[]args){ byte[]org = { 1,2,3,15,10,16,17,32,0,8 };string hex str = dataconvertutil . bytearraytohexstring(org);System.out.println(“转换结果:”+hex str);}执行结果:

结果:0102030F0A1011200008还不错,哈哈,挺满意的。那么让我们来看看丹尼尔是如何意识到的:

public static final char[]DIGITS _ UPPER = { ‘ 0 ‘,’ 1 ‘,’ 2 ‘,’ 3 ‘,’ 4 ‘,’ 5 ‘,’ 6 ‘,’ 7 ‘,’ 8 ‘,’ 9 ‘,’ A ‘,’ B ‘,’ C ‘,’ D ‘,’ E ‘,’ F ‘ };公共静态字符串bytetoHexString(final byte[]data){ final int l = data . length;final char[]out = new char[l & lt;& lt1];//两个字符组成十六进制值. for (int i = 0,j = 0;我& ltl;i++){ out[j++]= DIGITS _ UPPER[(0xf 0 & amp;data[I])& gt;& gt& gt4];out[j++]= DIGITS _ UPPER[0x0F & amp;data[I]];}返回新字符串(out);}测试程序:

public static void main(String[]args){ byte[]org = { 1,2,3,15,10,16,17,32,0,8 };string hex str = dataconvertutil . bytetohexstring(org);System.out.println(“转换结果:”+hex str);}执行结果:

结果:0102030F0A1011200008可以看出,与第一种方法相比,它要简单得多,但实际上,它所包含的知识并不是一个片段,充满了细节!那我们来详细解释一下是怎么实现的。

二、代码详解,大神的操作细节

首先,定义一个十六进制字符集:

public static final char[]DIGITS _ UPPER = { ‘ 0 ‘,’ 1 ‘,’ 2 ‘,’ 3 ‘,’ 4 ‘,’ 5 ‘,’ 6 ‘,’ 7 ‘,’ 8 ‘,’ 9 ‘,’ A ‘,’ B ‘,’ C ‘,’ D ‘,’ E ‘,’ F ‘ };这个字符集巧妙地利用了数组下标和字符元素的一一对应关系,为后续程序做准备。

然后,在程序开始时,两种方法都获得了原始字节数组的长度,并创建了一个新的“容器”作为返回的最后一个十六进制字符串。但是这里的长度变化非常有趣:

final char[]out = new char[l & lt;& lt1];第一种方法只是把长度* 2做出来,可见思维的不同。有不知道左移操作的朋友。欢迎阅读这篇文章《如何计算2 * 8?100%的面试官都想要这个答案,充分说明了

然后是for循环,它初始化两个变量I,j:

for (int i = 0,j = 0;我& ltl;I++)然后开始诸如取值和赋值的操作:

out[j++]= DIGITS _ UPPER[(0xf 0 & amp;data[I])& gt;& gt& gt4];out[j++]= DIGITS _ UPPER[0x0F & amp;data[I]];这两句话很有意思。j从0开始,放入out的下标直接执行++运算。不过这里用的是先加后减的方法。先取j = 0,赋值完成后再执行++相当于以下语句:

out[j]= DIGITS _ UPPER[(0xf 0 & amp;data[I])& gt;& gt& gt4];j++;out[j]= DIGITS _ UPPER[0x0F & amp;data[I]];j++;这是一个非常基本的测试细节。

然后等号右边是取值操作,从{‘0 ‘,’ 1 ‘,’ 2 ‘,’ 3 ‘,’ 4 ‘,’ 5 ‘,’ 6 ‘,’ 7 ‘,’ 8 ‘,’ 9 ‘,’ a ‘,’ b ‘,’ c ‘,’ d ‘和无符号右移>:& gt& gt。

我们知道一个字节有8位,高4位和低4位,所以(0xf 0 & amp data[I])& gt;& gt& gt4是计算出来的byte[i]的高四位,data[i] &amp 0xF0,用来转换成int正整数,这样in >:& gt;& gt4,结果不会因为字节的负号而不正确。比如data[i]是0xF0,如果是字节类型,实际上代表-16。如果直接执行>:& gt& gt右移位运算,那么它等于-1,所以这里有一个很重要的细节:看起来0xF0 &amp Data[i]保留了元素的高四位,是可选的,但实际上如果value >: 0x7F,字节类型就会变成负数,& And运算可以转换成正数!小伙伴们可以在下面做一些编码测试,这里可能解释不清楚。请原谅我。总体实现逻辑如下图所示:

总结

通过分别处理data[i]的高四位和低四位,可以在准备好的十六进制字符数组中找到对应的字符,拼接成一个新的char数组,完成功能。

你学会了吗?!

往昔精彩:

会话情景分析,String被final修饰的真正原因!一篇文章就够了”

大话Java 8 Lambda表达式(3)

Java如何处理JSON数据?杰克逊的快速介绍。

教你如何优雅地用Java8实现日期和时间的运算。

“必须测试!Java参数传递的真正秘密

-欢迎来到【爪哇圣斗士】,我是你的小可爱(ω)Morty-

-专注IT职场经验和IT技术分享的灵魂作家-

——每天带你去领略它的魅力——

-我期待陪伴你!-

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/14099.html
(0)
上一篇 2024年 1月 27日 23:51
下一篇 2024年 1月 28日 07:40

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注