1、按照一个字节打印byte数组
/**
* Print bytes data.
*/
private void printBytesArray(@NonNull byte[] data) {
StringBuilder sb = new StringBuilder();
sb.append("【 ");
for (byte element : data) {
sb.append(String.format("%02x", element));
sb.append(", ");
}
sb.append(" 】");
Log.i(TAG, "printArray byte data: " + sb.toString() + "data[] length = " + data.length);
}
2、打印Int数组
/**
* Print int data.
*/
private void printIntArray(@NonNull int[] data) {
StringBuilder sb = new StringBuilder();
sb.append("【 ");
for (int element : data) {
sb.append(Integer.toHexString(element));
sb.append(", ");
}
sb.append(" 】");
Log.i(TAG, "printArray int data: " + sb.toString() + "data[] length = " + data.length);
}
3、三个byte组合成一个Int类型
/** dtc_result[0] = 0xC1;//高字节
* dtc_result[1] = 0x92;//中字节
* dtc_result[2] = 0x80;//低字节
* dtc_result[3] = 0x9;//状态
*/
private byte[] dtc_result, dt_result_valid;
private int[] dtc_array;
private int dt_result_valid_length;
private int dt_result_valid_num;
public void getValidDtc(byte[] dtc_result) {
if ((dtc_result[3] > 3) && (dtc_result[3] % 4 == 3) && (dtc_result[6] == 0x1)) {
dt_result_valid_length = dtc_result[3] - 3;
dt_result_valid_num = dtc_result[3] / 4;
dt_result_valid = new byte[dt_result_valid_length];
dtc_array = new int[dt_result_valid_num];
System.arraycopy(dtc_result, 10, dt_result_valid, 0, dt_result_valid_length);
printBytesArray(dt_result_valid);
for (int i = 0; i < dt_result_valid_num; i++) {
dtc_array[i] = ((dt_result_valid[4 * i] << 16) & 0xFFFFFF) | ((dt_result_valid[4 * i + 1] << 8) & 0xFFFF) | ((dt_result_valid[4 * i + 2]) & 0xFF);
int temp0 = (dt_result_valid[4 * i] << 16) & 0xFFFFFF;
int temp1 = (dt_result_valid[4 * i + 1] << 8) & 0xFFFF;
Log.d(TAG, "temp0 = " + temp0 + " temp1 " + temp1);
Log.d(TAG, "printArray dtc_array[i] = " + i + " " + dtc_array[i]);
}
printIntArray(dtc_array);
}
}
关键点:高字节按位向左偏移16位,结果与0xFFFFFF,只要这三个字节;
中字节按位向左偏移8为,结果与0xFFFF,只要这两个字节;
低字节直接与0xFF,只要这一个字节。