2017-09-27 5 views
0

Je reçois des données bluetooth pour une structure condensée divisée sur 3 paquets, où le premier octet de chaque paquet est un nombre de ce paquet et le reste est des données. J'utilise le code suivant à l'assemblage stuct:memcpy avec offset pour struct dans swift

func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { 
     guard let value = characteristic.value as NSData? else { return } 

     var packetNumber = UInt8() 
     let maxPacketSize = 17 

     value.getBytes(&packetNumber, length: 1) 

     memcpy(&settings + maxPacketSize * (Int(packetNumber) - 1), value.bytes + 1, value.length - 1) 
} 

Il fonctionne bien avec le premier paquet, mais deuxième et troisième paquets ne sont pas copiés dans le struct, il reste rempli par des zéros. La même approche dans objc fonctionne bien avec tous les 3 paquets. Qu'est-ce qui ne va pas?

Merci!

Répondre

0

Après quelques expériences que j'ai pu trouver le code qui fonctionne:

 let destination: UnsafeMutableRawPointer = &settings + maxPacketSize * (Int(packetNumber) - 1) 
     memcpy(destination, value.bytes + 1, value.length - 1) 

Ressemble sans déclaration explicite de UnsafeMutableRawPointer il a créé juste UnsafeRawPointer. Intéressant que c'était seulement dans un cas de décalage supplémentaire.