Caractere \x00 [Résolu]

Signaler
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
-
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
-
Bonjour !

Voila je doit modifier des octets dans des valeurs binaires et j'ai des probleme avec le caractere 00.

Exemple plutot que de faire

chaine[1] =65;

chaine[2] = 66;

je fait chaine = "\x41\x42";

Mais j'ai des problemes avec \x00 exemple chaine = "\x41\x42\x00\x43\x44"; je me retrouve avec chaine ="AB".

Y a un moyen de coder le caractere de fin de chaine ??



Sinon ya pas un moyen plus simple pour remplacer des valeurs
intermediaires, c'est a dire faire en une seule commande chaine [3] =
88 et chaine [4] = 44 sans avoir a recreer une variable et a la copier
avec memcpy

12 réponses

Messages postés
74
Date d'inscription
jeudi 6 mars 2003
Statut
Membre
Dernière intervention
3 mai 2006

Une union c'est grosso modo comme une structure à la différence que tous les éléments pointent à la même adresse...

donc dans l'exemple que j'ai donné plus haut je me retrouve avec d'une
part une structure qui contient le détail de mes informations et
d'autre part avec une variable de type tableau de char dont la première
case pointe à la même adresse que le premier element de ma structure.



struct TOTO


{


unsigned int bidule ;


char texte1[10] ;


char texte2[10] ;


unsigned int blurp ;


unsigned int titi ;


};



union INFOS

{

struct TOTO ma_structure ;

char chaine_globale[sizeof(struct TOTO)] ;

}infos_tag ;



du coup je peux indifférement accéder à mes données soit element par element :

par exemple :

infos_tag.ma_structure.blurp



mais aussi par ma chaine :



infos_tag.chaine_globale[22] (pour arriver au même endroit)



donc si je veux, je peux par exemple lire un bloc de données contenu
dans un fichier en une fois en utilisant ma chaine_globale, modifier
uniquement l'élement blurp (ce qui modifie automatiquement
chaine_globale vu que c'est la même adresse) et écrire à nouveau dans
mon fichier la chaine_globale...



bien sur, les puristes diront qu'on peut le faire directement avec une
structure sans avoir à faire une union mais dans d'autres cas ça peut
se révéler très pratique comme par exemple pour le cas d'un traitement
d'une valeur qui peut soit être exprimée par un int soit par 2 char
(poid fort et poid faible)



struct VERSION_CHAR

{

unsigned char poids_fort ;

unsigned char poid_faible;

}



union CHAR_INT

{

unsigned int valeur_int ;

struct VERSION_CHAR valeur_char ;

}ma_valeur ;



on aura alors accès facilement à la valeur pour toutes les opérations pour lesquelles un int suffit :



ma_valeur.valeur_int ;



ou bien on pourra obtenir le détail :



ma_valeur.valeur_char.poids_fort ;

ou

ma_valeur.valeur_char.poids_faible ;



si quelqu'un a une meilleure explication à fournir, je suis preneur lol

en tout cas j'espère que ça te fera avancer


DvdMizo
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

Bonjour,



Pas tres bien compris ta question...

Tu veux faire quoi au juste ??? Sois un peu plus explicite, merci.

Matt...
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Ben en fait si je fait chaine = "\x41\x42\x00\x43\x44" je me retrouve
avec chaine ="ab" a cause du caractere /x00 qui fini la chaine.

Est ce qu il y a un moyen d eviter ca ?



Y aurait il une commande pour changer 5 octet dans une chaine ( en plein millieu) sans utiliser memcpy ?
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

Bonjour,



ca replace 5 caracteres dans une chaine.



#include <stdio.h>



int main(void)

{

char chaine[] = {"abcdefghijklmno"};

char replace[] = {"12345"};

size_t i;



for(i=0; i < (sizeof(replace) - 1); i++)

chaine[i+5] = replace[i];



printf("%s\n", chaine);

return 0;

}



Mais bon, il y a d'autres façon de faire mais là, je ne vois pas ce que tu veux faire.

Pourquoi ne pas utiliser memcpy ?

Poste un bout de code pour voir exactement.


Matt...
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

J'ai trouvé ca aussi

char s[10];
s = "ABCDEFGHIJ";
strncpy( s+5, "XXXX", 4 );

Mais gros probleme c'est ca
char ty[255];
sprintf(ty,"%s","\x61\x62\x00\x61\x62");
strncpy(ty,"\x61\x62\x00\x61\x62",5);

Pas moyen de me retrouver avec ma chaine complete
J'ai toujour ty ="ab" a cause du caractere NULL de fin de chaine (le /x00).
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

Bonjour,



C'est normal, '\0' c'est un caractere de fin de chaîne, tu ne peux pas faire autrement.

Si tu veux que printf("%s", ty) donne abab, il faut que tu enleves le '\0'.

Matt...
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Mais le prb c'est que je travaille avec des chaines binaire pas des
chaines de caractere donc certaines doivent avec certain octect =
"\0" je ne veut pas quelle me donne "abab" mais vraiment "ab(/0)ab" j
arrive a les copier en faisant



char ty[255];

ty[0]='a';

ty[1]='b';

ty[2]=0;

ty[3] = 'a';

ty[4] = 'b';



char tb[255];

memcpy( tb , ty , 6 );



Mais c'est la partir en rouge que je cherche a optimiser !!
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

Bonjour,



Je ne vois pas trop ce que tu peux optimisé, mais bon !!!

Tes octets tu les recuperes dans un fichier ?

Matt...
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Plus ou moins en fait je suis en train d ecrire des tag id3 V2 dans des
mp3 et pour chaque tag il me faut ecrire une chaine composé de /x00 et
de donnés diverses comme la longeur de la chaine binaire du tag ou meme
des octets dont je ne voit meme pas l utilité !!
Messages postés
74
Date d'inscription
jeudi 6 mars 2003
Statut
Membre
Dernière intervention
3 mai 2006

salut,


si tu connais le détail des informations à mettre dans ta chaine tu peux peut-être utiliser une union ne faisaint un truc dans ce genre :





#include <stdio.h>

#include <string.h>



int main(void)

{

int i ;



//on definit le format de la structure element par element

struct TOTO

{

unsigned int bidule ;

char texte1[10] ;

char texte2[10] ;

unsigned int blurp ;

unsigned int titi ;

};



//on associe la structure detaillee

//avec une chaine qui va contenir

//la totalite des donnees

union INFOS

{

struct TOTO ma_structure ;

char chaine_globale[sizeof(struct TOTO)] ;

}infos_tag ;





//on affecte des valeurs a chacune des donnees de la structure

infos_tag.ma_structure.bidule = 4501 ;

sprintf(infos_tag.ma_structure.texte1, "abcdefghi") ;

sprintf(infos_tag.ma_structure.texte2, "jklmnopqr") ;

infos_tag.ma_structure.blurp = 0 ;

infos_tag.ma_structure.titi = 65535 ;



// on tente l'affichage avec un printf

printf("resultat printf : \n%s\n\n", infos_tag.chaine_globale) ;

// le resultat n'est pas probant



// alors on essaye caractere par caractere

printf("resultat boucle (caracteres) : \n") ;

for(i=0 ; i < sizeof(struct TOTO) ; i++)

{

printf("%c", infos_tag.chaine_globale[i]) ;

}



// on peut ainsi constater que toutes les donnees

// existent bien dans la chaine



// on en profite pour les afficher par valeur (en hexa)

printf("\n\nresultat boucle (codes) : \n") ;

for(i=0 ; i < sizeof(struct TOTO) ; i++)

{

printf("\\x%02X ", (unsigned char) infos_tag.chaine_globale[i]) ;

}



return 0 ;

}



j'espère que ça t'aidera...
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Tiens je connaissait pas du tout les "union" tu n'aurais pas quelques
explication dessus stp ( je galere avec juste ce mot pour rechercher
sur la msdn)
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

V tester ca vu que en plus les octet a changer sont toujour les memes ( enfin plutot au meme endroit)

En tout cas je met resolu vu que je pense pas qu'un solution existe
(depuis le temps) et tu t es vraiment dechainé pour me decrire la
fonction union