swift - CheckSum8 模 256 Swift

标签 swift

我有一个 UInt8 数组,我想计算 CheckSum8 模 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)
}

最佳答案

您的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

关于swift - CheckSum8 模 256 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54935688/

相关文章:

ios - 我怎样才能得到像下面的 Apple Music 播放列表概述这样的 ListView ?

swift - NSMenuItem 设置状态不起作用

swift - 去除白色状态栏框

json - 使用 Alamofire 4 解析嵌套的 JSON

swift - Linux 上的 libswiftDemangle.so

swift - iOS 13 UISplitView 问题

swift - 类型 'AnyObject' 的值没有成员 ''

arrays - 更新 TextField 中的值并相应地更新其数组索引

swift - NSURL 和俄罗斯域名

swift - 作为参数传入的闭包是否分配给swift中的参数名称?