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 = HexString(aByte & 0xff);
if (temp.length() == 1) {
temp = '0' + temp;
}
res.append(temp);
}
数组类型字符串转数组String().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 HexString(source));
int comp = len - res.length();
//位数不⾜,需要补0
if(comp > 0) {
for (int i = 0; i < comp; i++) {
res.insert(0, "0");
}
}
String();
}
个⼈理解
上⽂提及的“合法⼗六进制字符串”指的是什么?
需要满⾜如下条件:
1、只能包含数字以及字母ABCDEF(包含⼤⼩写)
2、字符的个数必须是双数,⽐如“1”只能写成“01”
&0xff 到底有什么含义?
⾸先我们先了解⼀下基本作⽤
1 & 0 = 0
1 & 1 = 1
0 & 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);
}
结果是:
-1
255
a & 0xff的返回值是int,也就是说,将a这个字节的补码原封不动的拿出来,放到int中。
因为int 是四个字节,我们现在只⽤了两个字节,⾃然触碰不到符号位,这么⼀操作,就可以将 -1 映射成 255。
这样就可以理解字节转字符串中的这个转换了:
简⽽⾔之,我们确实需要存256个数,但是范围是0-255,⽽不是 -128-127,因为java不⽀持unsigned byte这种数据类型,所以我们需要借助容量更⼤的int完成这⼀转换。换句话说,如果java⽀持⽆符号byte,就不需要做这种转换了。(C#中的byte就是没有符号的,sbyte才是有符号的)
关于原码、补码、反码的相关概念,推荐⽂章:  zhuanlan.zhihu/p/91967268
如有错误,恳请批评指正!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。