|
|
@ -1,5 +1,8 @@
|
|
|
|
package com.platform.util;
|
|
|
|
package com.platform.util;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import io.netty.buffer.ByteBuf;
|
|
|
|
|
|
|
|
import io.netty.buffer.Unpooled;
|
|
|
|
|
|
|
|
|
|
|
|
public class CRCUtil {
|
|
|
|
public class CRCUtil {
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 一个字节包含位的数量 8
|
|
|
|
* 一个字节包含位的数量 8
|
|
|
@ -57,46 +60,267 @@ public class CRCUtil {
|
|
|
|
return b;
|
|
|
|
return b;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private static final int b0 = 0xAA;
|
|
|
|
private static final int[] MODBUS_TABLE = generateModbusTable();
|
|
|
|
private static final int b1 = 0x44;
|
|
|
|
private static final int[] CRC16_TABLE = {
|
|
|
|
private static final int b2 = 0x51;
|
|
|
|
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
|
|
|
|
private static final int b3 = 0x15;
|
|
|
|
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
|
|
|
|
private static final int b4 = 0x00;
|
|
|
|
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
|
|
|
|
private static final int b5 = 0x31;
|
|
|
|
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
|
|
|
|
private static final int b6 = 0x30;
|
|
|
|
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
|
|
|
|
private static final int b7 = 0x30;
|
|
|
|
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
|
|
|
|
private static final int b8 = 0x30;
|
|
|
|
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
|
|
|
|
private static final int b9 = 0x31;
|
|
|
|
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
|
|
|
|
private static final int b10 = 0x37;
|
|
|
|
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
|
|
|
|
private static final int b11 = 0x62;
|
|
|
|
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
|
|
|
|
private static final int b12 = 0x64;
|
|
|
|
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
|
|
|
|
private static final int b13 = 0x34;
|
|
|
|
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
|
|
|
|
private static final int b14 = 0x32;
|
|
|
|
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
|
|
|
|
private static final int b15 = 0x65;
|
|
|
|
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
|
|
|
|
private static final int b16 = 0x36;
|
|
|
|
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
|
|
|
|
private static final int b17 = 0x32;
|
|
|
|
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
|
|
|
|
|
|
|
|
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
|
|
|
|
|
|
|
|
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
|
|
|
|
|
|
|
|
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
|
|
|
|
|
|
|
|
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
|
|
|
|
|
|
|
|
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
|
|
|
|
|
|
|
|
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
|
|
|
|
|
|
|
|
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
|
|
|
|
|
|
|
|
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
|
|
|
|
|
|
|
|
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
|
|
|
|
|
|
|
|
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
|
|
|
|
|
|
|
|
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
|
|
|
|
|
|
|
|
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
|
|
|
|
|
|
|
|
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
|
|
|
|
|
|
|
|
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
|
|
|
|
|
|
|
|
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
|
|
|
|
|
|
|
|
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static final int[] CRCLIST= {
|
|
|
|
|
|
|
|
0x0,0x0,0x89,0x11,0x12,0x23,0x9b,0x32,0x24,0x46,0xad,0x57,0x36,0x65,0xbf,0x74,
|
|
|
|
|
|
|
|
0x48,0x8c,0xc1,0x9d,0x5a,0xaf,0xd3,0xbe,0x6c,0xca,0xe5,0xdb,0x7e,0xe9,0xf7,0xf8,
|
|
|
|
|
|
|
|
0x81,0x10,0x8,0x1,0x93,0x33,0x1a,0x22,0xa5,0x56,0x2c,0x47,0xb7,0x75,0x3e,0x64,
|
|
|
|
|
|
|
|
0xc9,0x9c,0x40,0x8d,0xdb,0xbf,0x52,0xae,0xed,0xda,0x64,0xcb,0xff,0xf9,0x76,0xe8,
|
|
|
|
|
|
|
|
0x2,0x21,0x8b,0x30,0x10,0x2,0x99,0x13,0x26,0x67,0xaf,0x76,0x34,0x44,0xbd,0x55,
|
|
|
|
|
|
|
|
0x4a,0xad,0xc3,0xbc,0x58,0x8e,0xd1,0x9f,0x6e,0xeb,0xe7,0xfa,0x7c,0xc8,0xf5,0xd9,
|
|
|
|
|
|
|
|
0x83,0x31,0xa,0x20,0x91,0x12,0x18,0x3,0xa7,0x77,0x2e,0x66,0xb5,0x54,0x3c,0x45,
|
|
|
|
|
|
|
|
0xcb,0xbd,0x42,0xac,0xd9,0x9e,0x50,0x8f,0xef,0xfb,0x66,0xea,0xfd,0xd8,0x74,0xc9,
|
|
|
|
|
|
|
|
0x4,0x42,0x8d,0x53,0x16,0x61,0x9f,0x70,0x20,0x4,0xa9,0x15,0x32,0x27,0xbb,0x36,
|
|
|
|
|
|
|
|
0x4c,0xce,0xc5,0xdf,0x5e,0xed,0xd7,0xfc,0x68,0x88,0xe1,0x99,0x7a,0xab,0xf3,0xba,
|
|
|
|
|
|
|
|
0x85,0x52,0xc,0x43,0x97,0x71,0x1e,0x60,0xa1,0x14,0x28,0x5,0xb3,0x37,0x3a,0x26,
|
|
|
|
|
|
|
|
0xcd,0xde,0x44,0xcf,0xdf,0xfd,0x56,0xec,0xe9,0x98,0x60,0x89,0xfb,0xbb,0x72,0xaa,
|
|
|
|
|
|
|
|
0x6,0x63,0x8f,0x72,0x14,0x40,0x9d,0x51,0x22,0x25,0xab,0x34,0x30,0x6,0xb9,0x17,
|
|
|
|
|
|
|
|
0x4e,0xef,0xc7,0xfe,0x5c,0xcc,0xd5,0xdd,0x6a,0xa9,0xe3,0xb8,0x78,0x8a,0xf1,0x9b,
|
|
|
|
|
|
|
|
0x87,0x73,0xe,0x62,0x95,0x50,0x1c,0x41,0xa3,0x35,0x2a,0x24,0xb1,0x16,0x38,0x7,
|
|
|
|
|
|
|
|
0xcf,0xff,0x46,0xee,0xdd,0xdc,0x54,0xcd,0xeb,0xb9,0x62,0xa8,0xf9,0x9a,0x70,0x8b,
|
|
|
|
|
|
|
|
0x8,0x84,0x81,0x95,0x1a,0xa7,0x93,0xb6,0x2c,0xc2,0xa5,0xd3,0x3e,0xe1,0xb7,0xf0,
|
|
|
|
|
|
|
|
0x40,0x8,0xc9,0x19,0x52,0x2b,0xdb,0x3a,0x64,0x4e,0xed,0x5f,0x76,0x6d,0xff,0x7c,
|
|
|
|
|
|
|
|
0x89,0x94,0x0,0x85,0x9b,0xb7,0x12,0xa6,0xad,0xd2,0x24,0xc3,0xbf,0xf1,0x36,0xe0,
|
|
|
|
|
|
|
|
0xc1,0x18,0x48,0x9,0xd3,0x3b,0x5a,0x2a,0xe5,0x5e,0x6c,0x4f,0xf7,0x7d,0x7e,0x6c,
|
|
|
|
|
|
|
|
0xa,0xa5,0x83,0xb4,0x18,0x86,0x91,0x97,0x2e,0xe3,0xa7,0xf2,0x3c,0xc0,0xb5,0xd1,
|
|
|
|
|
|
|
|
0x42,0x29,0xcb,0x38,0x50,0xa,0xd9,0x1b,0x66,0x6f,0xef,0x7e,0x74,0x4c,0xfd,0x5d,
|
|
|
|
|
|
|
|
0x8b,0xb5,0x2,0xa4,0x99,0x96,0x10,0x87,0xaf,0xf3,0x26,0xe2,0xbd,0xd0,0x34,0xc1,
|
|
|
|
|
|
|
|
0xc3,0x39,0x4a,0x28,0xd1,0x1a,0x58,0xb,0xe7,0x7f,0x6e,0x6e,0xf5,0x5c,0x7c,0x4d,
|
|
|
|
|
|
|
|
0xc,0xc6,0x85,0xd7,0x1e,0xe5,0x97,0xf4,0x28,0x80,0xa1,0x91,0x3a,0xa3,0xb3,0xb2,
|
|
|
|
|
|
|
|
0x44,0x4a,0xcd,0x5b,0x56,0x69,0xdf,0x78,0x60,0xc,0xe9,0x1d,0x72,0x2f,0xfb,0x3e,
|
|
|
|
|
|
|
|
0x8d,0xd6,0x4,0xc7,0x9f,0xf5,0x16,0xe4,0xa9,0x90,0x20,0x81,0xbb,0xb3,0x32,0xa2,
|
|
|
|
|
|
|
|
0xc5,0x5a,0x4c,0x4b,0xd7,0x79,0x5e,0x68,0xe1,0x1c,0x68,0xd,0xf3,0x3f,0x7a,0x2e,
|
|
|
|
|
|
|
|
0xe,0xe7,0x87,0xf6,0x1c,0xc4,0x95,0xd5,0x2a,0xa1,0xa3,0xb0,0x38,0x82,0xb1,0x93,
|
|
|
|
|
|
|
|
0x46,0x6b,0xcf,0x7a,0x54,0x48,0xdd,0x59,0x62,0x2d,0xeb,0x3c,0x70,0xe,0xf9,0x1f,
|
|
|
|
|
|
|
|
0x8f,0xf7,0x6,0xe6,0x9d,0xd4,0x14,0xc5,0xab,0xb1,0x22,0xa0,0xb9,0x92,0x30,0x83,
|
|
|
|
|
|
|
|
0xc7,0x7b,0x4e,0x6a,0xd5,0x58,0x5c,0x49,0xe3,0x3d,0x6a,0x2c,0xf1,0x1e,0x78,0xf
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
/** <a href="http://www.ip33.com/crc.html">CRC校验在线</a>
|
|
|
|
|
|
|
|
* CRC-16 (CCITT) 查表获取
|
|
|
|
|
|
|
|
* polynomial = 0x1021
|
|
|
|
|
|
|
|
* 输入输出均不反转
|
|
|
|
|
|
|
|
* 初始值为0xffff
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
private static short getCRC16(byte[] bytes, int initialCrc, int xorValue) {
|
|
|
|
|
|
|
|
// 初始化 CRC16 余数为 0xffff
|
|
|
|
|
|
|
|
int crc = initialCrc;
|
|
|
|
|
|
|
|
// 遍历每个字节
|
|
|
|
|
|
|
|
for (byte b : bytes) {
|
|
|
|
|
|
|
|
// 将字节转换为无符号整数
|
|
|
|
|
|
|
|
int bint = b & 0xFF;
|
|
|
|
|
|
|
|
// 从查表中取出对应的余数,并与当前的 CRC16 余数进行异或运算
|
|
|
|
|
|
|
|
crc = (crc << 8) ^ CRC16_TABLE[(crc >>> 8) ^ bint];
|
|
|
|
|
|
|
|
// 将 CRC16 余数限制在 16 位范围内
|
|
|
|
|
|
|
|
crc = crc & 0xFFFF;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 将最终的 CRC16 余数与结果异或值进行异或运算
|
|
|
|
|
|
|
|
crc = crc ^ xorValue;
|
|
|
|
|
|
|
|
return (short) crc;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static byte[] getCRC16CCITTFalse(byte[] bytes){
|
|
|
|
|
|
|
|
// 初始化 CRC16 余数为 0xffff
|
|
|
|
|
|
|
|
short crc16 = getCRC16(bytes, 0xffff, 0x0000);
|
|
|
|
|
|
|
|
return ByteUtils.shortToLittleEndianByteArray(crc16);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public static byte[] getCRCXMODEM(byte[] bytes){
|
|
|
|
|
|
|
|
// 初始化 CRC16 余数为 0xffff
|
|
|
|
|
|
|
|
short crc16 = getCRC16(bytes, 0x0000, 0x0000);
|
|
|
|
|
|
|
|
return ByteUtils.shortToLittleEndianByteArray(crc16);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 和地面站的校验一致,参考{@link ByteUtils#getCRC(int[])}
|
|
|
|
|
|
|
|
* @param bytes
|
|
|
|
|
|
|
|
* @return
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public static byte[] getCRC16WithGcs(byte[] bytes) {
|
|
|
|
|
|
|
|
return getCRCXMODEM(bytes);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 获取验证码byte数组,基于Modbus CRC16的校验算法
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public static byte[] getModbusCRC16(byte[] bytes) {
|
|
|
|
|
|
|
|
// modbus的多项式为0x8005, 但是输入输出均需要反转,等价使用0xa001多项式 (0X8005和0XA001高低位互反)
|
|
|
|
|
|
|
|
final int polynomial =0xA001;
|
|
|
|
|
|
|
|
// 预置16 位CRC寄存器寄存器为十六进制0xFFFF
|
|
|
|
|
|
|
|
int crc = 0xFFFF;
|
|
|
|
|
|
|
|
for (byte b : bytes) {
|
|
|
|
|
|
|
|
// 把第一个 8 位二进制数据 与 16 位的 CRC寄存器的低 8 位相异或, 把结果放于 CRC寄存器
|
|
|
|
|
|
|
|
crc = ((crc & 0xFF00) | (crc & 0x00FF) ^ (b & 0xFF));
|
|
|
|
|
|
|
|
for (int j = 0; j < Byte.SIZE; j++) {
|
|
|
|
|
|
|
|
// 把 CRC 寄存器的内容右移一位( 朝低位)用 0 填补最高位, 并检查右移后的移出位
|
|
|
|
|
|
|
|
if ((crc & 0x0001) > 0) {
|
|
|
|
|
|
|
|
// 如果移出位为 1, CRC寄存器与多项式A001进行异或
|
|
|
|
|
|
|
|
crc = crc >> 1;
|
|
|
|
|
|
|
|
crc = crc ^ polynomial;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// 如果移出位为 0,再次右移一位
|
|
|
|
|
|
|
|
crc = crc >> 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 返回 CRC16 校验码, 大端序,高位在前低位在后
|
|
|
|
|
|
|
|
return ByteUtils.shortToBigEndianByteArray((short) crc);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static byte[] getModbusCRC16ByteTable(byte[] data) {
|
|
|
|
|
|
|
|
// 初始化 CRC16 余数为 0xFFFF
|
|
|
|
|
|
|
|
int crc = 0xFFFF;
|
|
|
|
|
|
|
|
// 遍历每个字节
|
|
|
|
|
|
|
|
for (byte b : data) {
|
|
|
|
|
|
|
|
// 将字节转换为无符号整数
|
|
|
|
|
|
|
|
int bint = b & 0xFF;
|
|
|
|
|
|
|
|
// 从查表中取出对应的余数,并与当前的 CRC16 余数进行异或运算
|
|
|
|
|
|
|
|
crc = (crc >>> 8) ^ MODBUS_TABLE[(crc & 0xFF) ^ bint];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 返回 CRC16 校验码, 大端序,高位在前低位在后
|
|
|
|
|
|
|
|
return ByteUtils.shortToBigEndianByteArray((short) crc);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**生成 MODBUS CRC16 表
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
private static int[] generateModbusTable() {
|
|
|
|
|
|
|
|
int[] modbusTable = new int[256];
|
|
|
|
|
|
|
|
// 遍历每个可能的 8 位数据
|
|
|
|
|
|
|
|
for (int i = 0; i < 256; i++) {
|
|
|
|
|
|
|
|
int remainder = i;
|
|
|
|
|
|
|
|
for (int bit = 0; bit < 8; bit++) {
|
|
|
|
|
|
|
|
// 如果最低位为 1,那么余数右移一位,并与多项式异或
|
|
|
|
|
|
|
|
if ((remainder & 1) == 1) {
|
|
|
|
|
|
|
|
remainder = (remainder >>> 1) ^ 0xA001;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
remainder = remainder >>> 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
modbusTable[i] = remainder;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return modbusTable;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static byte[] getCRCfromGcsTelemetryData(ByteBuf data, int start, int len) {
|
|
|
|
|
|
|
|
byte[] rtn = new byte[2];
|
|
|
|
|
|
|
|
short count = 0;
|
|
|
|
|
|
|
|
int C0 = 0, C1 = 0, Y0 = 0, Y1 = 0, Z0 = 0, Z1 = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (count < len) {
|
|
|
|
|
|
|
|
Y0 = (CRCLIST[2 * (data.getByte(start + count) & 0xFF)] ^ C1) & 0xFF;
|
|
|
|
|
|
|
|
Y1 = (CRCLIST[2 * (data.getByte(start + count) & 0xFF) + 1]) & 0xFF;
|
|
|
|
|
|
|
|
Z0 = (CRCLIST[2 * C0] & 0xFF);
|
|
|
|
|
|
|
|
Z1 = (CRCLIST[2 * C0 + 1] & 0xFF);
|
|
|
|
|
|
|
|
C0 = ((Y0 ^ Z0) & 0xFF);
|
|
|
|
|
|
|
|
C1 = ((Y1 ^ Z1) & 0xFF);
|
|
|
|
|
|
|
|
count++;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rtn[1] = (byte) C1;
|
|
|
|
|
|
|
|
rtn[0] = (byte) C0;
|
|
|
|
|
|
|
|
return rtn;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static byte[] getCRCfromGcsTelemetryData(byte[] data, int start, int len) {
|
|
|
|
|
|
|
|
byte[] rtn = new byte[2];
|
|
|
|
|
|
|
|
short count = 0;
|
|
|
|
|
|
|
|
int C0 = 0, C1 = 0, Y0 = 0, Y1 = 0, Z0 = 0, Z1 = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (count < len) {
|
|
|
|
|
|
|
|
Y0 = (CRCLIST[2 * (data[start + count] & 0xFF)] ^ C1) & 0xFF;
|
|
|
|
|
|
|
|
Y1 = (CRCLIST[2 * (data[start + count] & 0xFF) + 1]) & 0xFF;
|
|
|
|
|
|
|
|
Z0 = (CRCLIST[2 * C0] & 0xFF);
|
|
|
|
|
|
|
|
Z1 = (CRCLIST[2 * C0 + 1] & 0xFF);
|
|
|
|
|
|
|
|
C0 = ((Y0 ^ Z0) & 0xFF);
|
|
|
|
|
|
|
|
C1 = ((Y1 ^ Z1) & 0xFF);
|
|
|
|
|
|
|
|
count++;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rtn[1] = (byte) C1;
|
|
|
|
|
|
|
|
rtn[0] = (byte) C0;
|
|
|
|
|
|
|
|
return rtn;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// private static final int b0 = 0xAA;
|
|
|
|
|
|
|
|
// private static final int b1 = 0x44;
|
|
|
|
|
|
|
|
// private static final int b2 = 0x51;
|
|
|
|
|
|
|
|
// private static final int b3 = 0x15;
|
|
|
|
|
|
|
|
// private static final int b4 = 0x00;
|
|
|
|
|
|
|
|
// private static final int b5 = 0x31;
|
|
|
|
|
|
|
|
// private static final int b6 = 0x30;
|
|
|
|
|
|
|
|
// private static final int b7 = 0x30;
|
|
|
|
|
|
|
|
// private static final int b8 = 0x30;
|
|
|
|
|
|
|
|
// private static final int b9 = 0x31;
|
|
|
|
|
|
|
|
// private static final int b10 = 0x37;
|
|
|
|
|
|
|
|
// private static final int b11 = 0x62;
|
|
|
|
|
|
|
|
// private static final int b12 = 0x64;
|
|
|
|
|
|
|
|
// private static final int b13 = 0x34;
|
|
|
|
|
|
|
|
// private static final int b14 = 0x32;
|
|
|
|
|
|
|
|
// private static final int b15 = 0x65;
|
|
|
|
|
|
|
|
// private static final int b16 = 0x36;
|
|
|
|
|
|
|
|
// private static final int b17 = 0x32;
|
|
|
|
|
|
|
|
// public static void main(String[] args) {
|
|
|
|
|
|
|
|
// byte[] ack = new byte[18];
|
|
|
|
|
|
|
|
// ack[0] = (byte)b0;
|
|
|
|
|
|
|
|
// ack[1] = (byte)b1;
|
|
|
|
|
|
|
|
// ack[2] = (byte)b2;
|
|
|
|
|
|
|
|
// ack[3] = (byte)b3;
|
|
|
|
|
|
|
|
// ack[4] = (byte)b4;
|
|
|
|
|
|
|
|
// ack[5] = (byte)b5;
|
|
|
|
|
|
|
|
// ack[6] = (byte)b6;
|
|
|
|
|
|
|
|
// ack[7] = (byte)b7;
|
|
|
|
|
|
|
|
// ack[8] = (byte)b8;
|
|
|
|
|
|
|
|
// ack[9] = (byte)b9;
|
|
|
|
|
|
|
|
// ack[10] = (byte)b10;
|
|
|
|
|
|
|
|
// ack[11] = (byte)b11;
|
|
|
|
|
|
|
|
// ack[12] = (byte)b12;
|
|
|
|
|
|
|
|
// ack[13] = (byte)b13;
|
|
|
|
|
|
|
|
// ack[14] = (byte)b14;
|
|
|
|
|
|
|
|
// ack[15] = (byte)b15;
|
|
|
|
|
|
|
|
// ack[16] = (byte)b16;
|
|
|
|
|
|
|
|
// ack[17] = (byte)b17;
|
|
|
|
|
|
|
|
// byte[] b = crc16(ack, 2, 16);
|
|
|
|
|
|
|
|
// StringUtil tool = new StringUtil();
|
|
|
|
|
|
|
|
// System.out.println(tool.bytesToHexString(b));
|
|
|
|
|
|
|
|
// }
|
|
|
|
public static void main(String[] args) {
|
|
|
|
public static void main(String[] args) {
|
|
|
|
byte[] ack = new byte[18];
|
|
|
|
// EB 90 02 01 02 5C 00 00 00 00 00 00 80 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 BA
|
|
|
|
ack[0] = (byte)b0;
|
|
|
|
byte[] data = {(byte) 0xEB, (byte) 0x90, (byte) 0x02, (byte) 0x01, (byte) 0x02, (byte) 0x5C, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80, (byte) 0x21, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00};
|
|
|
|
ack[1] = (byte)b1;
|
|
|
|
ByteBuf buf = Unpooled.wrappedBuffer(data);
|
|
|
|
ack[2] = (byte)b2;
|
|
|
|
System.out.println("getCRC16WithGcs : " + ByteUtils.bytes2HexString(getCRCfromGcsTelemetryData(data, 2, 28)));
|
|
|
|
ack[3] = (byte)b3;
|
|
|
|
System.out.println("getCRC16WithGcs : " + ByteUtils.bytes2HexString(getCRCfromGcsTelemetryData(buf.slice(2, 28), 0,28)));
|
|
|
|
ack[4] = (byte)b4;
|
|
|
|
|
|
|
|
ack[5] = (byte)b5;
|
|
|
|
|
|
|
|
ack[6] = (byte)b6;
|
|
|
|
|
|
|
|
ack[7] = (byte)b7;
|
|
|
|
|
|
|
|
ack[8] = (byte)b8;
|
|
|
|
|
|
|
|
ack[9] = (byte)b9;
|
|
|
|
|
|
|
|
ack[10] = (byte)b10;
|
|
|
|
|
|
|
|
ack[11] = (byte)b11;
|
|
|
|
|
|
|
|
ack[12] = (byte)b12;
|
|
|
|
|
|
|
|
ack[13] = (byte)b13;
|
|
|
|
|
|
|
|
ack[14] = (byte)b14;
|
|
|
|
|
|
|
|
ack[15] = (byte)b15;
|
|
|
|
|
|
|
|
ack[16] = (byte)b16;
|
|
|
|
|
|
|
|
ack[17] = (byte)b17;
|
|
|
|
|
|
|
|
byte[] b = crc16(ack, 2, 16);
|
|
|
|
|
|
|
|
StringUtil tool = new StringUtil();
|
|
|
|
|
|
|
|
System.out.println(tool.bytesToHexString(b));
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|