⼗六进制字符串转字节数组
/**
* 功能: ⼗六进制字符串转字节数组 * @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
如有错误,恳请批评指正!
因篇幅问题不能全部显示,请点此查看更多更全内容