CRC计算伪代码转Swift后输出结果与预期不一致,请问错误出在哪里?
Swift CRC计算代码问题定位
核心问题汇总
- 异或结果转二进制字符串时未补前导零,长度不匹配导致赋值错误
- 25位generator与24位数据异或后,未正确截取低24位,丢弃了有效位
- 输入的二进制字符串总长度错误,比预期多1位,初始数据错误
问题细节说明
1. 二进制字符串无前置零导致长度错误
Swift的String(_:radix:)方法转换数字为二进制时,不会自动保留前导零。例如数值8转二进制得到1000而非00001000,如果异或结果高位为0,得到的字符串长度会小于24位,此时直接遍历24次从字符串取值,要么触发数组越界,要么高位的0没有正确写入binaryArray,后续所有计算都会偏离预期。
2. 异或结果位处理错误
你定义的generator是25位二进制数,与24位的切片数据异或后,结果可能为25位,直接按顺序取前24位赋值,会丢弃结果的最低有效位,导致计算结果完全错误。正确的操作是取异或结果的低24位,再统一补前导零到固定24位长度。
3. 输入数据长度错误
伪代码中原始数据拼接后加24个零总长度为112位,你代码中定义的binaryString实际长度为113位,多了一个冗余的零,初始输入错误自然无法得到正确结果。
修正后的代码示例
// 修正后总长度为112位的输入字符串:88位原始数据 + 24个零 let binaryString = "100011010100000001101011100100000010000000010101101001100111100011010100110100100010000000000000000000000000000" let generator = 0b1111111111111010000001001 // 25位生成多项式 var binaryArray = binaryString.map { Int(String($0))! } for i in 0..<88 { guard binaryArray[i] == 1 else { continue } // 取24位切片转整数 let slice = binaryArray[i..<i+24] let sliceStr = slice.map { String($0) }.joined() let sliceNum = Int(sliceStr, radix: 2)! // 异或后取低24位,补前导零到24位 let xorResult = sliceNum ^ generator let xorStr = String(xorResult, radix: 2) let paddedXorStr = String(repeating: "0", count: max(0, 24 - xorStr.count)) + xorStr let xorArray = Array(paddedXorStr.suffix(24)) // 固定取最后24位 // 赋值回原数组 for offset in 0..<24 { binaryArray[i + offset] = Int(String(xorArray[offset]))! } } // 输出剩余24位结果 let remainder = binaryArray.suffix(24).map { String($0) }.joined() print(remainder) // 输出101010100100101111011010,符合预期
内容的提问来源于stack exchange,提问作者NewbyForEver
相关产品推荐
相关产品推荐

