Swift校验和字节

时间:2017-10-09 11:47:05

标签: arrays swift bluetooth-lowenergy checksum

我有一个非常棘手的问题。我将一个带有iOS设备的字节数组发送到ble设备(led light),它工作得很好。 我有一份所有命令的文件,这些命令很难从中文翻译过来。 整个byte-package的构建如下:

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

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

我找到了漂亮的小帮手

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

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

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

1 个答案:

答案 0 :(得分:4)

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"