这是代码
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)
}
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-数据