Контрольная сумма CRC 16 от C ++ до Java

У меня есть источник с контрольной суммой CRC16 в C ++:

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

Может быть, кто-то может помочь мне найти правильный путь, я понятия не имею, что не так …

-1

Решение

0x6975 или десятичный 26997 это правильный результат. Ваши результаты C ++ не имеют смысла. (Шестнадцатеричный и десятичный значения даже не совпадают.)

1

Другие решения

Это правда … это была моя ошибка.

Снова я проверил вывод, и это было главное.

Результат в C ++ это больше не похоже на размер quint16
(без знака int 2 байта от 0 до 65535)

Я распечатал это в неправильном месте.

Но это не одна причина, другая была небольшая разница между bytearray.

0