我在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
也许有人可以帮我找到合适的方法,我不知道出了什么问题......
答案 0 :(得分:1)
0x6975
或十进制26997
是正确的结果。你的C ++结果毫无意义。 (十六进制和十进制数字甚至不是相同的值。)
答案 1 :(得分:0)
那是真的......这是我的错误。
我再次检查输出,这就是重点。
C ++中的结果就像quint16大小一样 (unsigned int 2字节0到65535)
我把它打印在错误的地方。
但这不是一个原因,另一个原因是bytearray之间存在细微差别。