Decomposition de buffer

Résolu
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 - 12 juin 2007 à 11:37
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 - 14 juin 2007 à 11:49
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

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

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

 
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
13 juin 2007 à 12:00
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
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
13 juin 2007 à 12:13
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
13 juin 2007 à 12:15
je sais pas si j'ai bien reconstitué le problème en fait

Loki
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 juin 2007 à 13:12
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

 
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 juin 2007 à 13:20
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)

 
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
13 juin 2007 à 13:40
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
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 juin 2007 à 13:55
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)
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 juin 2007 à 14:25
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 ????

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

donne :

c :?
i :12

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

 
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
13 juin 2007 à 15:00
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
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 juin 2007 à 15:12
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...

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

 
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
13 juin 2007 à 15:43
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
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 juin 2007 à 15:47
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 !!!
;-)

 
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
13 juin 2007 à 15:48
ouaip

Loki
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 juin 2007 à 16:01
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?

 
0
Rejoignez-nous