校验和CRC 16从C 到Java

Checksum CRC 16 from C++ to Java

本文关键字:Java CRC 校验和      更新时间:2023-10-16

我的源具有C 中的charksum 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 = x02x14x14x00x00x00x00x00x00x00x00x00x00

结果是:

int result = 65535
QByteArray result = x1dx20

我试图在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

也许有人可以帮助我找到正确的方法,我不知道怎么了...

0x6975或十进制26997是正确的结果。您的C 结果没有意义。(十六进制和十进制的值都不相同。)

是的,这是我的错误。

我再次检查了输出,这就是重点。

C 的结果这不像Quint16大小(unsigned int 2字节0至65535)

我在错误的地方printf。

这不是一个原因,另一个是bytearray之间的小区别。