2017-02-08 2 views
0

J'ai travaillé avec Cypress BLE PSoC 4200, et j'ai mis en place ma base de données GATT pour envoyer des paquets de données int32 à mon iPhone. Cependant, vous ne pouvez écrire dans la base de données du GATT qu'avec des données uint8. J'ai donc écrit ce qui suit pour prendre cette lecture de tension int32 et le mettre dans un tableau uint8 octets:Comment obtenir 4 octets de données (uint8_t) dans une variable de type uint32_t

// function passes in int32 variable 'result' 
    uint8 array[4]; 
    array[0] = result & 0xFF; 
    array[1] = (result >> 8) & 0xFF; 
    array[2] = (result >> 16) & 0xFF; 
    array[3] = (result >> 24) & 0xFF; 

Ainsi, étant donné que l'esprit, lorsque ce paquet int32 est envoyé, je veux être en mesure de prendre chaque octet, et les recombiner en quelque sorte dans la valeur int32 originale, et l'imprimer à l'écran (par exemple 456000 sera 0,456 V).

En ce moment, j'obtenir les 4 octets et les manipule comme tels:

NSData* data = [characteristic value]; 
    const uint8_t *reportData = [data bytes]; 

    // variable to hold the eventual 32-bit data 
    uint32_t voltage = 0; 

Est-il possible de passer par chaque indice de *reportData et concaténer les octets? Toute aide fera, merci.

+0

Jetez un oeil à la méthode '' getBytes' de NSData' ... –

+0

'getBytes: longueur:' méthode fonctionne très bien, merci Martin. –

Répondre

0

Est-ce que quelque chose comme ça ne fonctionnerait pas?

uint32_t v0 = (uint32_t)reportData[0]; 
uint32_t v1 = (uint32_t)reportData[1] << 8; 
uint32_t v2 = (uint32_t)reportData[2] << 16; 
uint32_t v3 = (uint32_t)reportData[3] << 24; 

uint32_t voltage = v0 | v1 | v2 | v3; 
+0

Au début, je pensais que le casting de 'uint32_t' ne ferait que" transférer "l'adresse à' v0', mais j'avais tort. Cela fonctionne très bien, merci! –