我有一个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)
}
答案 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
(十六进制)。