You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:15:08