Caractere \x00

Résolu
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013 - 20 mai 2005 à 18:45
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013 - 1 juin 2005 à 17:59
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

Dvdmizo Messages postés 74 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 3 mai 2006
31 mai 2005 à 21:03
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
3
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
21 mai 2005 à 14:53
Bonjour,



Pas tres bien compris ta question...

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

Matt...
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
21 mai 2005 à 17:49
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 ?
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
22 mai 2005 à 11:22
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...
0

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

Posez votre question
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
22 mai 2005 à 11:42
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).
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
22 mai 2005 à 16:02
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...
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
22 mai 2005 à 17:05
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 !!
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
22 mai 2005 à 19:51
Bonjour,



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

Tes octets tu les recuperes dans un fichier ?

Matt...
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
24 mai 2005 à 19:03
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é !!
0
Dvdmizo Messages postés 74 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 3 mai 2006
31 mai 2005 à 15:13
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...
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
31 mai 2005 à 18:01
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)
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
1 juin 2005 à 17:59
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
0
Rejoignez-nous