ios - 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)
}
解决方案
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
推荐阅读
- javascript - 如何显示没有属性名称的数据
- css - 使用 SVG 遮罩时可见 Chrome 1px 线
- powershell - 在启动过程 MSIEXEC 中扩展 $Env:TEMP 时遇到问题
- python - Python连接字符串语句放在单独的行上
- python - Python 中的生命线生存分析。该方法的部分危险是什么?
- javascript - 将字符串变量中的任何单词与数据属性匹配
- tfs-2015 - 更改 TFSService 密码
- css - JavaFx CSS - 滑块轨道
- matlab - 如何在 Matlab 中格式化自定义类的命令窗口输出?
- cordova - 生成 apk 时出现 Cordova-plugin-file 错误