2017-10-09 9 views
0

J'ai un problème assez délicat. J'envoie un tableau d'octets avec un appareil iOS à un périphérique ble (led light) qui fonctionne très bien. J'ai un document pour toutes les commandes qui est très mal traduit du chinois. L'ensemble du paquet d'octets est construit comme suit:Somme de contrôle rapide des octets

  • La face avant de commande (1 octet)
  • La longueur du paquet de commande (1 octet)
  • ID de commande (1 octet)
  • commande de une partie de commande (1 octet)
  • de champ de données (15 octets)
  • de départ (1 octet)

Par exemple le paquet complet pour allumer la lumière est "A1080100FFFFFF59" Jusqu'ici tout est clair pour moi. La seule chose que je lutte avec est le dernier octet ou comment il est appelé dans le document: "Check". Le document dit juste: "L'instruction du code de contrôle: vérifier le code = (0 - s'attendre à la somme de l'octet en octet entier)". Dans l'exemple ci-dessus "59" serait la somme de contrôle. Mais peu importe comment j'essaie de le calculer, je ne vais pas à "59".

Je trouve la jolie petite aide

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

Mais je ne suis pas les « contrôles » droit pour toute commande.

Peut-être que quelqu'un a une idée de comment cela est calculé?

Répondre

2

256 - [your checksum algorithm] retours 0x59, alors peut-être que: il est

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

Cela est logique. Merci beaucoup. – Patricks

+0

Oui, le document dit "0 - attend la somme d'octets dans l'octet entier". En arithmétique de bits non signés sur 8 bits, '0 & - x' est identique à' 256 & - x' Comme vous avez réellement besoin d'un 'UInt8', vous pouvez simplifier le calcul de checksum comme ceci:' return 0 & - self.reduce (0 , & +) ' – JeremyP