【问题标题】:Swift checksum of bytes快速字节校验和
【发布时间】:2017-10-09 11:47:04
【问题描述】:

我有一个非常棘手的问题。我使用 iOS 设备将字节数组发送到工作正常的 ble 设备(LED 灯)。 我有一个所有命令的文档,从中文翻译得很差。 整个字节包是这样构建的:

  • 命令前面(1字节)
  • 命令包长度(1字节)
  • 命令的 ID(1 字节)
  • 命令的控制部分(1字节)
  • 数据字段(15字节)
  • 检查(1字节)

例如打开灯的完整包是“A1080100FFFFFF59” 到目前为止,我对一切都很清楚。我唯一纠结的是最后一个字节或它在文档中的调用方式:“检查”。 该文件只是说:“校验码的指令:校验码=(0 - 期望整个字节中的字节总和)”。 在上面的示例中,"59" 将是校验和。但无论我如何计算,我都不会达到“59”

我找到了好帮手

public extension Data {
    public func checkSum() -> Int {
        return self.map { Int($0) }.reduce(0, +) & 0xff
    } 
}

但我没有得到任何命令的正确“检查”

也许有人知道这是如何计算的?

【问题讨论】:

    标签: arrays swift bluetooth-lowenergy checksum


    【解决方案1】:

    256 - [your checksum algorithm] 返回0x59,也许就是这样:

    var data = Data([0xA1, 0x08, 0x01, 0x00, 0xFF, 0xFF, 0xFF])
    
    extension Data {
        var checksum: Int {
            return self.map { Int($0) }.reduce(0, +) & 0xff
        }
    }
    
    let result = 256 - data.checksum
    "0x\(String(result, radix: 16))" // "0x59"
    

    【讨论】:

    • 这是有道理的。非常感谢。
    • 是的,文档说“0 - 期望整个字节中的字节总和”。在 8 位无符号位运算中,0 &- x256 &- x 相同,因为您实际上需要 UInt8,您可以像这样简化校验和计算:return 0 &- self.reduce(0, &+)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多