首页 > 解决方案 > CRC16-CCITT 计算

问题描述

我试图快速创建一个 CRC16-CCITT 计算。但这些值不是预期的。我想找出哪一个是错误的,我的代码或规范文档的值。有人可以帮我弄这个吗。

根据规范,(CRC16-CCITT)
初始值:0xFFFF
输入:0xAA
计算方向:MSB First(左移)
输出: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)
}

标签: iosswiftcrc16

解决方案


CRC的初始化应该是

var crc = final

并且CRC的更新应该是

    crc ^= UInt16(byte) << 8

通过这些更改,您的代码会生成0xF550输入的校验和0xAA。请注意,位顺序颠倒0xF550是预期0x0AAF的,因此这是您计算中缺少的步骤。

使用crc-16 cccitt 问题中的方法 - 计算不正确

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

推荐阅读