2017-10-09 104 views
0

我有一個相當棘手的問題。我用iOS設備發送一個字節數組到一個可以正常工作的可充電設備(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 
    } 
} 

但我沒有得到任何命令的權利「檢查」

也許有人有一個想法如何計算?

回答

2

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

這是有道理的。非常感謝。 – Patricks

+0

是的,文件說「0 - 全字節中字節的總和」。在8位無符號位算術中,'0&'-x'與'256& - x'相同因爲實際上你需要一個'UInt8',所以你可以簡化校驗和計算,例如:return 0& - self.reduce(0 ,&+)' – JeremyP