您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页Java十六进制字符串与二进制数组互转、0xff的作用

Java十六进制字符串与二进制数组互转、0xff的作用

来源:爱go旅游网
Java⼗六进制字符串与⼆进制数组互转、0xff的作⽤

⼗六进制字符串转字节数组

/**

* 功能: ⼗六进制字符串转字节数组 * @param hexString ⼗六进制字符串 * @return 字节数组 */

public static byte[] convertHexStringToBytes(String hexString){ //判空

if(hexString == null || hexString.length() == 0) { return null; }

//合法性校验

if(!hexString.matches(\"[a-fA-F0-9]*\") || hexString.length() % 2 != 0) { return null; }

//计算

int mid = hexString.length() / 2; byte[]bytes = new byte[mid]; for (int i = 0; i < mid; i++) {

bytes[i] = Integer.valueOf(hexString.substring(i * 2, i * 2 + 2), 16).byteValue(); }

return bytes; }

字节数组转⼗六进制字符串

/**

* 字节数组转16进制数 * @param bytes 字节数组 * @return 返回值 */

public static String convertBytesToHexString(byte[]bytes) { StringBuilder res = new StringBuilder(\"\"); for (byte aByte : bytes) {

String temp = Integer.toHexString(aByte & 0xff); if (temp.length() == 1) { temp = '0' + temp; }

res.append(temp); }

return res.toString().toUpperCase(); }

整数转化为⼗六进制字符串

/**

* 功能:将整数转化为合法的⼗六进制字符串 * @param source 整数

* @param len ⾄少占多少个字节 * @return ⼗六进制数 *

* 说明:为什么要有len?

* 某些场景需要指定⼤⼩的⼆进制字符串(这⾥的⼤⼩指的是转化为字节数组后所占⼤⼩) * 例如,现在需要把1这个整数转化为⼗六进制数, * 如果len为1,结果为 01 * 如果len为2,结果为 0001 *

* 但是len不限制⼤⼩,⽐如len设置为1,source为125120,那么结果仍然为1e8c0, * 不会截断结果 */

public static String convertIntToHexString(int source, int len) { //⼀个字节占两位,所以要乘以2 len <<= 1;

StringBuilder res = new StringBuilder(Integer.toHexString(source)); int comp = len - res.length();

//位数不⾜,需要补0 if(comp > 0) {

for (int i = 0; i < comp; i++) { res.insert(0, \"0\"); } }

return res.toString(); }

个⼈理解

上⽂提及的“合法⼗六进制字符串”指的是什么?

需要满⾜如下条件:

1、只能包含数字以及字母ABCDEF(包含⼤⼩写)2、字符的个数必须是双数,⽐如“1”只能写成“01”

&0xff 到底有什么含义?

⾸先我们先了解⼀下基本作⽤1 & 0 = 01 & 1 = 10 & 0 = 0

计算机中⼆进制数都是以补码的形式存在a & 0xff 表⽰取 a 补码的后⼋位。

16进制字符串的范围是 0x00 到 0xff,0到255

java中的byte是有符号的,⼀个byte表⽰的范围是 -128到127。

⽽在这⾥,我们不需要byte的符号属性,只需要它⽼⽼实实的表⽰0到255即可,所以不得不将128到255之间的数据做⼀个映射。换句话说,11111111(补码), 如果最⾼位作为符号位, 它是-1,如果不作为符号位,那就能表⽰255.

public static void main(String[] args) { byte a = -1; int b = a & 0xff;

System.out.println(a); System.out.println(b); }

结果是:

-1255

a & 0xff的返回值是int,也就是说,将a这个字节的补码原封不动的拿出来,放到int中。

因为int 是四个字节,我们现在只⽤了两个字节,⾃然触碰不到符号位,这么⼀操作,就可以将 -1 映射成 255。这样就可以理解字节转字符串中的这个转换了:

Integer.toHexString(aByte & 0xff);

简⽽⾔之,我们确实需要存256个数,但是范围是0-255,⽽不是 -128-127,因为java不⽀持unsigned byte这种数据类型,所以我们需要借助容量更⼤的int完成这⼀转换。换句话说,如果java⽀持⽆符号byte,就不需要做这种转换了。(C#中的byte就是没有符号的,sbyte才是有符号的)关于原码、补码、反码的相关概念,推荐⽂章: https://zhuanlan.zhihu.com/p/91967268

如有错误,恳请批评指正!

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igat.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务