常用方法的基础【面试也常问】
将一个int(byte)AA 转成 16进制显示(也是byte array 16进制打印显示的基础)
String result = Interger.toHexString(AA & 0xFF);
这里为什么要 &0xFF ,可以参考这个链接:
Java 教程|byte 转换 int 时为何与 0xff 进行与运算
将一个 16 BBB进制字符串,转成byte
byte result = (byte)Integer.parseInt(BBB,16)
将byte[] 数据以16进制打印
public static String bytesToHexString(byte[] b){
StringBuilder rel = new StringBuilder();
for (int i = 0; i < b.length; i++)
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = ’0′ + hex;
}
rel.append(hex.toUpperCase());// 用大写的形式展现出来
}
return rel.toString();
}
int 和 byte[] 等之间的转换
方法1:利用系统工具ByteBuffer
byte[] 转 int
// data 为byte[4]
ByteBuffer buffer = ByteBuffer.wrap(data);
int reuslt = buffer.getInt();
int 转byte[]
ByteBuffer buffer = ByteBuffer.allocate(4);
buffer.put(data);
byte[] result = buffer.array();
ByteBuffer扩展
ByteBuffer 可以设置大端序,小端序
ByteBuffer用来获取一序列数据,并从中读取int,short等非常方便 ,对于modbus 这种就非常方便,如下
// data 为byte[],从设备读取的
ByteBuffer buffer = ByteBuffer.wrap(data);
// 获取一个 signed32
int data1 = buffer.getInt() ;
// 获取一个 un_signed32
int data2 = buffer.getInt() & 0xFFFFFFFF;
// 获取一个 un_signed16 (无符号 short)
int dataUShort = buffer.getShort() & 0xFFFF;
// 获取一个 signed16
int dataShort = buffer.getShort();
方法2:正常按位拆和按位合并
正常byte[] 转int(比如CAN扩展帧CANID,一般由29 个bit)
原理:一个int 占4个字节,即 4 个byte
// 这里为展示,假定 传入的data 一定是4位,且高位在前
public static int bytesToInt(byte[] data){
int result = 0;
result += (int)((data[0] & 0xFF) << 24);
result += (int)((data[1] & 0xFF) << 16);
result += (int)((data[2] & 0xFF) << 8);
result += (int)(data[3] & 0xFF);
}
byte[] 转 int (比较常见)
一个两位的byteArr[],高位在前,低位在后
比如:一个int 转成 4 个byte(高位在前,低位在后)
原理:一个int 占4个字节,即 4 个byte
public static byte[] intToByteArray(int num){
byte[] result = new byte[4];
result [0] = (byte)((num >>24) & 0xFF);
result [1] = (byte)((num >>16) & 0xFF);
result [2] = (byte)((num >> 8 ) &0xFF);
result [3] = (byte)(num & 0xFF);
return result;
}