2013-08-15 5 views
0

Je cherche à construire une chaîne binaire composée de valeurs hexadécimales ... J'ai appris que sprintf n'est pas la bonne façon d'accomplir cela. J'ai un vrai gui simple pour collecter les paramètres de configuration qui doivent être envoyés à un périphérique. Les valeurs peuvent être signées et seront toujours numériques. J'ai un ensemble de valeurs telles que:C - créer un paquet en utilisant char et int

#define PKTHEAD 0xA5 
#define VALONE 0xA0 
#define VALTWO 0xA1 
#define VALTHREE 0xA2 
#define PKTTAIL 0x5A 

signed int val1 = 10000; //0x2710 
signed int val2 = -84; //0xFFAC 
signed int val3 = -175001 //0xFFFD5467 

Mon objectif final est d'avoir un paquet qui ressemblerait « PKTHEAD | PKTHEAD | PKTHEAD | Valone | val1 | VALTWO | val2 | VALTHREE | val3 | PKTTAIL | PKTTAIL | PKTTAIL ", et la représentation hexadécimale serait A5A5A5A000002710A1FFFFFFACA2FFFD54675A5A5A.

En ce moment je fais ceci:

int main(int argc, char *argv[]) 
{ 
    int numBytes = 10; 
    signed char *tmp; 
    signed char *pyld; 
    pyld = calloc(numBytes, sizeof(char)); 

    signed int val1 = 10000; //0x2710 
    signed int val2 = -84; //0xFFAC 
    signed int val3 = -175001 //0xFFFD5467 

    tmp = pyld; 

    *(tmp + (numBytes - 1)) = DACHEAD; 
    *(tmp + (numBytes - 2)) = DACHEAD; 
    *(tmp + (numBytes - 3)) = DACHEAD; 
    *(tmp + (numBytes - 4)) = VALONE; 
    *(tmp + (numBytes - 5)) = val1; 
    printf("payload = %hhx%hhx%hhx%hhx%hx%hx%hhx%hx\n", pyld[9], pyld[8], pyld[7], pyld[6], pyld[5], pyld[4], pyld[3], pyld[2], pyld[1], pyld[0]); 
} 

La sortie est: « charge utile = a5a5a5a0100a1ffac »

Ma valeur val1 est incorrecte et je me demande s'il y a une meilleure façon de composer ce paquet. Devrais-je faire des changements de bits à la place?

Toute aide est grandement appréciée.

Merci!

Répondre

0

Une meilleure façon d'envoyer des données sur le réseau est d'utiliser une bibliothèque de sérialisation. Par exemple, voir this question

Aussi, si vous ne voulez pas utiliser des bibliothèques externes, vous devez d'abord comprendre la taille integer que vous avez besoin, que ce soit il est 16 bit ou 32 bit, le endianness (et convertir en conséquence) que votre appareil utilise et toujours préférez utiliser memcpy pour mettre des valeurs de taille correcte dans un tampon binaire.