计算低字节和高字节CRC16 - Java
Calculate low and high bytes CRC16 - Java
我遇到了 CRC16 算法的问题。有一串16进制的80 01 F0,经过CRC16后得到低字节=23,高字节=80。那么问题来了,这两个字节怎么计算呢?我尝试了 CRC 计算器,但没有结果。另外,如果Java中有这个方法的例子就完美了。
在手册中还有其他信息:
使用对所有字节计算的多项式 (X16 + X15 + X2 + 1) 的前向 CRC-16 算法的低字节和高字节。它使用种子 0xFFFF 进行初始化。
感谢您的回复。我相信我的回答对其他人有用。经过测试和工作的代码。
private static byte[] getCRC16LowHighBytes(byte[] byteSequence) {
// Create a byte array for Low and High bytes
byte[] returnBytes = new byte[2];
int crc = CRC16_SEED;
for (int i = 0; i < byteSequence.length; ++i) {
crc ^= (byteSequence[i] << 8);
for (int j = 0; j < 8; ++j) {
if ((crc & 0x8000) != 0) {
crc = (crc << 1) ^ CRC16_POLINOM;
} else {
crc <<= 1;
}
}
}
byte[] crcBytes = getBytes(crc);
// The first two bytes of crcBytes are low and high bytes respectively.
for (int i = 0; i < returnBytes.length; i++) {
returnBytes[i] = crcBytes[i];
}
return returnBytes;
}
private static byte[] getBytes(int v) {
byte[] writeBuffer = new byte[4];
writeBuffer[3] = (byte) ((v >>> 24) & 0xFF);
writeBuffer[2] = (byte) ((v >>> 16) & 0xFF);
writeBuffer[1] = (byte) ((v >>> 8) & 0xFF);
writeBuffer[0] = (byte) ((v >>> 0) & 0xFF);
return writeBuffer;
}
我遇到了 CRC16 算法的问题。有一串16进制的80 01 F0,经过CRC16后得到低字节=23,高字节=80。那么问题来了,这两个字节怎么计算呢?我尝试了 CRC 计算器,但没有结果。另外,如果Java中有这个方法的例子就完美了。 在手册中还有其他信息: 使用对所有字节计算的多项式 (X16 + X15 + X2 + 1) 的前向 CRC-16 算法的低字节和高字节。它使用种子 0xFFFF 进行初始化。
感谢您的回复。我相信我的回答对其他人有用。经过测试和工作的代码。
private static byte[] getCRC16LowHighBytes(byte[] byteSequence) {
// Create a byte array for Low and High bytes
byte[] returnBytes = new byte[2];
int crc = CRC16_SEED;
for (int i = 0; i < byteSequence.length; ++i) {
crc ^= (byteSequence[i] << 8);
for (int j = 0; j < 8; ++j) {
if ((crc & 0x8000) != 0) {
crc = (crc << 1) ^ CRC16_POLINOM;
} else {
crc <<= 1;
}
}
}
byte[] crcBytes = getBytes(crc);
// The first two bytes of crcBytes are low and high bytes respectively.
for (int i = 0; i < returnBytes.length; i++) {
returnBytes[i] = crcBytes[i];
}
return returnBytes;
}
private static byte[] getBytes(int v) {
byte[] writeBuffer = new byte[4];
writeBuffer[3] = (byte) ((v >>> 24) & 0xFF);
writeBuffer[2] = (byte) ((v >>> 16) & 0xFF);
writeBuffer[1] = (byte) ((v >>> 8) & 0xFF);
writeBuffer[0] = (byte) ((v >>> 0) & 0xFF);
return writeBuffer;
}