首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CheckSum8模256 Swift

CheckSum8模256 Swift
EN

Stack Overflow用户
提问于 2019-03-01 07:08:55
回答 1查看 607关注 0票数 0

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

e.g

代码语言:javascript
复制
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

Below函数返回41,但预期校验和为35。

代码语言:javascript
复制
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)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-01 16:06:09

您的checkSum方法在很大程度上是正确的。如果您愿意,您可以将其简化为:

代码语言:javascript
复制
func checkSum(_ values: [UInt8]) -> UInt8 {
    let result = values.reduce(0) { ($0 + UInt32($1)) & 0xff }
    return UInt8(result)
}

您指出了一个报告06B127c5f59d的checksum8为35的网站。

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

因此,请考虑:

代码语言:javascript
复制
let values: [UInt8] = [0x06, 0xB1, 0x27, 0xc5, 0xf5, 0x9d]
let result = checkSum(values)

那是53。如果你想看到十六进制(就像你提到的那个站点):

代码语言:javascript
复制
let hex = String(result, radix: 16)

这表明校验和是十六进制的0x35

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54935688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档