CheckSum8 Modulo 256迅捷

时间:2019-02-28 23:08:55

标签: swift checksum8

我有一个UInt8数组,我想计算CheckSum8 Modulo 256。 如果字节总数小于255,则checkSum函数将返回正确的值。

例如

let bytes1 : [UInt8] = [1, 0xa1]
let validCheck = checkSum(data : bytes1) // 162 = 0xa2
let bytes : [UInt8] = [6, 0xB1, 27,0xc5,0xf5,0x9d]
let invalidCheck = checkSum(data : bytes) // 41

下面的函数返回41,但预期的校验和为35。

func checkSum(data: [UInt8]) -> UInt8 {

    var sum = 0
    for i in 0..<data.count {
        sum += Int(data[i])
    }
    let retVal = sum & 0xff
    return UInt8(retVal)
}

1 个答案:

答案 0 :(得分:2)

您的checkSum方法基本上是正确的。如果需要,可以将其简化为:

func checkSum(_ values: [UInt8]) -> UInt8 {
    let result = values.reduce(0) { ($0 + UInt32($1)) & 0xff }
    return UInt8(result)
}

您指出一个报告06B127c5f59d的校验和8为35的网站。

问题是您的数组中包含27,而不是0x27。如果您有十六进制值,则在数组文字中始终需要为每个值使用0x前缀(或者,至少从技术上讲,如果该值大于9时)。

因此,请考虑:

let values: [UInt8] = [0x06, 0xB1, 0x27, 0xc5, 0xf5, 0x9d]
let result = checkSum(values)

53。如果您想以十六进制形式查看(例如您所指的那个站点):

let hex = String(result, radix: 16)

这表明我们校验和为0x35(十六进制)。