我有 C++ 中校验和 CRC16 的源代码:
quint16 MainWindow::calculateCRC16(QByteArray buffer)
{
quint16 newCrc;
quint8 i;
newCrc = 0xFFFF;
for(i = 0; i < buffer.size(); i++){
newCrc = this->crc16_update(newCrc, (quint8)buffer.at(i));
}
return newCrc;
}
quint16 MainWindow::crc16_update(quint16 crc, quint8 a)
{
quint8 i;
crc ^= a;
for (i = 0; i < 8; ++i) {
if (crc & 1)
crc = (crc >> 1) ^ 0xA001;
else
crc = (crc >> 1);
}
return crc;
}
例如,当我们放:
QByteArray buffer = \x02\x14\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
结果是:
int result = 65535
QByteArray result = \x1d\x20
我试图在 Java 中实现相同的结果,但没有积极的效果
第一个例子:
int calculate_crc(byte[] bytes) {
int i;
int crc_value = 0;
for (int len = 0; len < bytes.length; len++) {
for (i = 0x80; i != 0; i >>= 1) {
if ((crc_value & 0x8000) != 0) {
crc_value = (crc_value << 1) ^ 0x8005;
} else {
crc_value = crc_value << 1;
}
if ((bytes[len] & i) != 0) {
crc_value ^= 0x8005;
}
}
}
return crc_value;
}
另一个:
private int calculateCRC16(byte[] buffer)
{
int newCrc;
int i;
newCrc = 0xFFFF;
for(i = 0; i < buffer.length; i++) {
newCrc = this.crc16_update(newCrc, buffer[i]);
}
return newCrc;
}
int crc16_update(int crc, int a)
{
int i;
crc ^= a;
for (i = 0; i < 8; ++i) {
if ((crc & 1) == 1){
crc = (crc >> 1) ^ 0xA001;
}
else{
crc = (crc >> 1);
}
}
return crc;
}
例如,当我们放置两种情况时:
byte[] buffer = 0x2 0x14 0x14 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
结果是:
int result = 26997
byte[] result = 0x69 0x75
也许有人可以帮助我找到正确的方法,我不知道出了什么问题......