-1

我有 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

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

4

2 回答 2

1

0x6975或十进制26997是正确的结果。您的 C++ 结果毫无意义。(十六进制和十进制甚至不是相同的值。)

于 2015-05-06T00:54:19.670 回答
0

那是真的……这是我的错误。

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

C++ 中的结果,这与 quint16 大小(无符号整数 2 字节 0 到 65535)没什么两样

我把它放在了错误的地方。

但这不是一个原因,另一个原因是 bytearray 之间的差异很小。

于 2015-05-09T16:53:35.753 回答