最近在做密码产品方面的接口测试,经常需要在16进制和字节数组之间转换,以及将整数转换为字节流进行网络传输,因此整理出如下的工具代码,在这里进行记录,以供后续重复使用。
十六进制转字节数组
public static byte[] hexToBytes(String hex) {
int len = hex.length();
byte[] result = new byte[len/2];
if(len % 2 != 0) {
System.out.println("len % 2 != 0");
return null;
}
for(int i = 0, j = 0; i < len; i+=2, j++) {
result[j] = (byte)Integer.valueOf(hex.substring(i, i + 2), 16).intValue();
}
return result;
}
字节数组用十六进制输出
这里做了一个重载,默认输出整个字节数组,也可以指定长度。
如果你想要一个String,而不是直接输出,用String的format方法应该可以做到,可以自行改造测试一下。
public static void showHex(String msg, byte[] data) {
showHex(msg, data, data.length);
}
public static void showHex(String msg, byte[] data, int dataLen) {
int limitLen = data.length < dataLen ? data.length : dataLen;
System.out.println(msg);
for(int i = 0; i < limitLen; ++i) {
if(i != 0 && i % 32 == 0) {
System.out.println();
}
System.out.printf("%02X", data[i]);
}
System.out.println();
}
整数转换为字节数组
这里要注意字节序的问题,因为Java保存整数用的是小端序,所以这里转换也是把低位数据放在数组的前面。
/**
* int整数转换为4字节的byte数组 小端序
*
* @param i
* 整数
* @return byte数组
*/
public static byte[] intToByte4(int i) {
byte[] targets = new byte[4];
targets[0] = (byte) (i & 0xFF);
targets[1] = (byte) (i >> 8 & 0xFF);
targets[2] = (byte) (i >> 16 & 0xFF);
targets[3] = (byte) (i >> 24 & 0xFF);
return targets;
}
字节数组转换为整数
这里同样要注意字节序,否则转换出的整数很可能不对。这里是按照小端序进行处理,如果你们系统使用的大端序,记得一定要调整一下。
/**
* byte数组转换为int整数 小端序
*
* @param bytes
* byte数组
* @param off
* 开始位置
* @return int整数
*/
public static int byte4ToInt(byte[] bytes, int off) {
int b0 = bytes[off] & 0xFF;
int b1 = bytes[off + 1] & 0xFF;
int b2 = bytes[off + 2] & 0xFF;
int b3 = bytes[off + 3] & 0xFF;
return (b0) | (b1 << 8) | (b2 << 16) | (b3 << 24);
}