У меня есть источник с контрольной суммой 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
Может быть, кто-то может помочь мне найти правильный путь, я понятия не имею, что не так …
0x6975
или десятичный 26997
это правильный результат. Ваши результаты C ++ не имеют смысла. (Шестнадцатеричный и десятичный значения даже не совпадают.)
Это правда … это была моя ошибка.
Снова я проверил вывод, и это было главное.
Результат в C ++ это больше не похоже на размер quint16
(без знака int 2 байта от 0 до 65535)
Я распечатал это в неправильном месте.
Но это не одна причина, другая была небольшая разница между bytearray.