Decomposition de buffer

Résolu
Signaler
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
-
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
-
salut,

j'aimerais de l'aide ou sinon au moins des précisions si possible sur un petit bout de code SVP.

Voila mon pb : je recupére une trame dans un buffer défini ainsi BYTE buffer[4000];
ma trame est composée comme ceci : STX-DATA-ETX (en tres gros)
STX et ETX sont de l'hexa correspondant a 0x02 et 0x03 respectivement.
mes données sont une suite de caractére a decomposer aussi on va dire 5caractere pour le nom suivi de 10 pr le prenom (pr exemple)

voila je ne sais pas trop comment decomposer ma trame et retirer les STX ETX et ensuite decomposer ma chaine de caracteres qui est en hexa
pr les stocker dans des variables comme cela: char prenom [10]; char nom[5];

si mon buffer originel était une chaine de caractere j'aurais pu faire : strncpy_s( nom, buffer , 5);
mais comme la mon buffer est une suite d'octets je ne sais pas comment faire l'equivalent ...

pourriez vous m'aider ou du moins me guider SVP ! merci d'avance.

 

51 réponses

Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
caste ton void en char avec : char MsgTyp = (char)(lpBuffer[0]);

Loki
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
memes erreurs avec le cast ....
t'es sur que vaut mieux pas utiliser memcpy?

 
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
ah bah je sais pas, lol jtrouvais ca un peu bidon juste pour un seul caractère mais bon :p comme je te l'ai dit je suis pas une bête, ma vie est faite de tests et d'incertitudes (et surtout d'erreurs).

essaie avec un memcpy, je vais regarder ce qui se passe de mon côté.

Loki
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
mais en fait, tu fais pas ton test dans la même fonction que celle ou est créé le buffer de BYTE c'est ça ?
et dans la déclaration de ta fonction t'as mis void *  lpBuffer ?

t'es vraiment obligé de mettre void ? la type des tableaux peut changer dans ton programme ou bien t'as que du texte ?
si que du texte remplace void * (ou LPVOID) par char* ou BYTE*

void fct(BYTE * buf)
{
    char ch = buf[0];
}

void main()
{
    BYTE buffer[4000];

    fct(buffer);
}

ça ça passe chez moi, mais pas ça :

void fct(void * buf)
{
    char ch = buf[0];
}

ni même avec tous les casts qu'on veut. car, il ne sait pas sur combien d'octets il doit piocher.

Loki
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
je sais pas si j'ai bien reconstitué le problème en fait

Loki
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
si si je crois que t'as bien compris j'appel bien une fonction avec un LPVOID
je vais c hanger le type en BYTE* vu que je ne receptionnerai que des chaines de caracteres de ce type :
STX-125608472-ETX

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
du coup  pr ecrire des données : on peut faire cela ??
//WriteACQ
        BYTE bufAck[2+1];
        bufAck[0] = ACK;
        bufAck[1] = ETX;
        bufAck[2] = '\0';
        WriteBlock( bufAck, strlen(bufAck));

avec WriteBlock(LPVOID lpBuffer, DWORD dwNbBytesToWrite)

 
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
alors là tu me poses une colle. je ne connais pas du toute cette fonction (WriteBlock).

pour ce qui est des lignes précédentes tu peux aussi faire : BYTE bufAck[2+1] = {ACK,ETX,0};

'\0' revient à insérer un 0
attention le remplissage de cette manière là ne peut se faire qu'à l'initialistion.

si tu fais :

BYTE bufAck;
bufAck = {...};

ca foire.

Loki
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
voila ma decomposition finale ou quasi pr ceux qui seraient ds un futur intérréssé par ce type de pb:
    int i;
    char* Infos = new char[MAX_LENGTH_DATA_S800];
    //Décodage STX-ETX
    char N  = lpBuffer[1];    //nombre total d'octets STX ETX inclus
    char I  = lpBuffer[2];    //indice du message a FF
    char NE = lpBuffer[3];    //Nombre d'ETX supprimés et placés en fin de message
    int  LengthInfo = (int)(N)-6;    //N-6 --> longueur de la chaine Informations
    for (i=0; i<LengthInfo ;i++)
    {
        Infos[i] = lpBuffer[4+i];   
    }
    Infos[LengthInfo] = '\0';    //fin de chaine

 MERCI a ceux qui m'ont aider a mieux comprendre (loki,nikiiyk)
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
je reviens a la charge car la ca compile bien mais je pense qua a l'execution ca fera pas ce que j'attends:
 sur cette partie la:
char N  = lpBuffer[1];    //nombre total d'octets STX ETX inclus
int  LengthInfo = (int)(N)-6;    //N-6 --> longueur de la chaine Informations

en fait est ce que si dans mon buffeur on me dit que la chaine sera de 20 et que j'execute mon code
LenghtInfo vaudra t il 14 ????

 
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
    char c=12;
    int i=(int)c;
    cout<<"c :"<<c<<"\ni :"<<i<<endl;

donne :

c :?
i :12

Loki
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
donc c'est bon !!!
ce que j'ai fait?
pas besoin de atoi?

 
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
non. atoi c'est quand tu as un caractère de 0 à 9 que tu veux transformer en chiffre (ou alors une chaine en nombre). là tu te sers d'un char pour stocker un nombre. donc aucun problème de conversion.
par contre si tu avais eu : N=55, ca aurait pu etre soit le nombre 55, soit le chiffre 7 codé en ASCII
et dans le deuxième cas, il aurait fallu utiliser atoi

je sais pas si c'est très clair.

Loki
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
ouais ben justement je ne sais pas trop si on m'nvoit un char qui sera du nbre a stocker direct ou si il y aura une conversion avant la correspondance en ASCII
a mon avis ils envoient direct la valeur stocké dans le char...

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
mais justement si il m'envoit 20 pour le nombre c'octets total ca ne fait pas deux caracteres ?
 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
N peut etre compris entre 6 et 255 pr infos ...

 
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
tu peux pas dépasser 255 pour la simple et bonne raison que BYTE c'est un octet et que avec 8 bits t'es limité à 256 valeurs. (2^8)

si tu dis que N peut varier sur tout ça et que le nombre est forcément compris uniquement dans buffer[1] et pas sur plusieurs octets, alors ce que tu reçois est forcément déjà prêt à être utilisé. parce que pour le nombre 255, s'il est en caractères, il faut trois octets, un par chiffre. de plus les codes ascii des chiffres vont de 48 à 57 et rien d'autre.

Loki
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
c'est exactement ce que je me disais si c'est sur un seul octet c'est du tout bon ... par rapport a ce que l'on a fait !!!
;-)

 
Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
ouaip

Loki
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
en fait ce qui me bloque et me fait bugguer (mon cerveau aps mon programme ;-) )
c'est que j'ai deux docs 1 qui explique comment decomposer la trame (Ce que l'on vient de faire)
et une doc qui dit comment decomposer les messages d'informations apres :
 message 1:
    id message 2caracteres (10)
    position   2caracteres ( 56 ou 57)

message 2
    id message 2caracteres (11)
    sens 1 caractere (1 ou 0)

et du coup qd je vois 2 caractere pr l'id du message je dois lire 2 octets maintenant et non plus un seul...
c'est un peu contradictoire de ce que l'on a fait pr decomposer la trame ? tu trouves pas?