校验和CRC 16从C ++到Java

时间:2015-05-05 17:25:12

标签: java c++ crc16

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

C ++中的结果就像quint16大小一样 (unsigned int 2字节0到65535)

我把它打印在错误的地方。

但这不是一个原因,另一个原因是bytearray之间存在细微差别。