我有一个UInt8数组,我想要计算CheckSum8模256。如果字节总和小于255,则checkSum函数返回正确的值。
e.g
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) // 41Below函数返回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)
}发布于 2019-03-01 16:06:09
您的checkSum方法在很大程度上是正确的。如果您愿意,您可以将其简化为:
func checkSum(_ values: [UInt8]) -> UInt8 {
let result = values.reduce(0) { ($0 + UInt32($1)) & 0xff }
return UInt8(result)
}您指出了一个报告06B127c5f59d的checksum8为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。
https://stackoverflow.com/questions/54935688
复制相似问题