当前位置: 首页 > 知识库问答 >
问题:

CRC16-CCITT计算

姬乐
2023-03-14

这是代码

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)
}

共有1个答案

范翰飞
2023-03-14

CRC的初始化应该是

var crc = final

《儿童权利公约》的更新应该是

    crc ^= UInt16(byte) << 8

通过这些更改,代码将为输入0xaa生成校验和0xf550。请注意,0xF550应该是0x0AAF,位顺序相反,因此这是计算中缺少的步骤。

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
 类似资料:
  • 我试过用 如何在php中计算crc16 CRC16函数的C到PHP转换 我在寻找校验和

  • 在这里,有一个CCITT-CRC16的实现。对于那些避免链接,它是用C写的,如下所示: 我需要在CCITT-CRC16实现中找到的两个字段:和,所以我的问题是······用于更新CRC的整数值是什么意思?在我翻译的代码中,程序执行很多次,然后在再次调用之前更改,并且执行多次。假设我将所有这些逐一保存到一个名为的数组中。 所有这些字符产生的CRC是否会通过...调用? 另外,我必须为数组使用类型吗?

  • 他们使用术语截断多项式来表示:。他们使用什么模式将此扩展到此?

  • 这给出了一个值-107。我对C还比较陌生,我还在做一些实验 谢谢你。

  • 我试图将一个旧代码从C移植到C#,它基本上接收一个字符串并返回一个CRC16... 我的移植C#代码如下: 测试字符串是“OPN”...它必须返回一个uint,ofc)2字节a8a9,#CRC_MASK是该计算的多项式。我确实在这里和网上找到了几个CRC16的例子,但没有一个达到这个结果,因为这个CRC计算必须与我们连接的设备匹配。 错在哪里?我真的很感激任何帮助。 cmd变量的值是我试图发送到设

  • FF-源地址 53-数据 70-数据