Расчет CRC16-CCITT

Я пытался быстро произвести расчет CRC16-CCITT. Но значений не предвидится. Я хочу выяснить, что из них не так, мой код или значения документа спецификации. Может кто-то помочь мне с этим.

Согласно спецификации, (CRC16-CCITT)
начальное значение: 0xFFFF
Вход: 0xAA
Направление вычисления: Сначала MSB (сдвиг влево)
Выход: 0x0AAF

Вот код

func crc16ccitt(data: [UInt8],seed: UInt16 = 0x1d0f, final: UInt16 = 0xffff)->UInt16{
    var crc = final
    data.forEach { (byte) in
        crc ^= UInt16(byte) << 8
        (0..<8).forEach({ _ in
            if (crc & UInt16(0x8000)) != 0 {
                crc = (crc << 1) ^ 0x1021
            }
            else {
                crc = crc << 1
            }
        })
    }
    return UInt16(crc)
}

ОБНОВЛЕННЫЙ ответ

func crc16ccitt(data: [UInt8],seed: UInt16 = 0x1d0f, final: UInt16 = 0xffff) -> UInt16{
    var crc = final
    data.forEach { (byte) in
        crc ^= UInt16(byte) << 8
        (0..<8).forEach({ _ in
            if (crc & UInt16(0x8000)) != 0 {
                crc = (crc << 1) ^ 0x1021
            }
            else {
                crc = crc << 1
            }
            //crc = (crc & UInt16(0x8000)) != 0 ? (crc << 1) ^ 0x1021 : crc << 1
        })
    }
    return UInt16(crc ^ final)
}

person mmk    schedule 07.07.2020    source источник


Ответы (1)


Инициализация CRC должна быть

var crc = final

и обновление CRC должно быть

    crc ^= UInt16(byte) << 8

С этими изменениями ваш код производит контрольную сумму 0xF550 для ввода 0xAA. Обратите внимание, что 0xF550 ожидается 0x0AAF с обратным порядком битов, так что это недостающий шаг в ваших вычислениях.

Использование методов из проблема cccitt crc-16 - неправильный расчет это было бы

func crc16ccitt_false() -> UInt16 {
    return crc16(data_order: straight_8, remainder_order: reverse_16, remainder: 0xffff, polynomial: 0x1021)
}

Пример:

let tData = Data([0xAA])
print(String(format: "crc16ccitt_false:  %04X", tData.crc16ccitt_false())) // 0AAF
person Martin R    schedule 07.07.2020