现在有一个String指令
String a="01 03 03ed 0001";
我通过自己写的CRC转码方法将上述指令转码
String a1=getCRC.getCRC(a);
然后把两个字符串拼接起来
String a2=a+" "+a1;
然后获得各数值,其实就是去掉中间的空格,我就笼统的写一下。
String h=a2.substring(0, 2);
String h1=a2.substring(3, 5);
String h2=a2.substring(6, 8);
String h3=a2.substring(8, 10);
String h4=a2.substring(11, 13);
String h5=a2.substring(13, 15);
String h6=a2.substring(16, 18);
String h7=a2.substring(19, 21);
然后将得到的字符串再拼接起来
String h8=h+h1+h2+h3+h4+h5+h6+h7;
得到的h8的数据为:010303ed0001147B
理想情况下需要呈现的buye数组为下面的方式
byte b=new byte[]{
0x01,0x03,0x03,(byte)0xed,0x00,0x01,0x14,(byte)0x7B
};
现在尝试了很多种方法都无法变成上述样子,想来此求助一下,有没有大神指导一下。
补充代码中getCRC代码块
public class getCRC {
public static String getCRC(String data) {
data = data.replace(" ", "");
int len = data.length();
if (!(len % 2 == 0)) {
return "0000";
}
int num = len / 2;
byte[] para = new byte[num];
for (int i = 0; i < num; i++) {
int value = Integer.valueOf(data.substring(i * 2, 2 * (i + 1)), 16);
para[i] = (byte) value;
}
return getCRC(para);
}
/**
* 计算CRC16校验码
*
* @param bytes
* 字节数组
* @return {@link String} 校验码
* @since 1.0
*/
public static String getCRC(byte[] bytes) {
// CRC寄存器全为1
int CRC = 0x0000ffff;
// 多项式校验值
int POLYNOMIAL = 0x0000a001;
int i, j;
for (i = 0; i < bytes.length; i++) {
CRC ^= ((int) bytes[i] & 0x000000ff);
for (j = 0; j < 8; j++) {
if ((CRC & 0x00000001) != 0) {
CRC >>= 1;
CRC ^= POLYNOMIAL;
} else {
CRC >>= 1;
}
}
}
// 结果转换为16进制
String result = Integer.toHexString(CRC).toUpperCase();
if (result.length() != 4) {
StringBuffer sb = new StringBuffer("0000");
result = sb.replace(4 - result.length(), 4, result).toString();
}
//高位在前地位在后
//return result.substring(2, 4) + " " + result.substring(0, 2);
// 交换高低位,低位在前高位在后
return result.substring(2, 4) + " " + result.substring(0, 2);
}
}