Caractere \x00 [Résolu]

SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention - 20 mai 2005 à 18:45 - Dernière réponse : SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention
- 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
Afficher la suite 

12 réponses

Répondre au sujet
Dvdmizo 74 Messages postés jeudi 6 mars 2003Date d'inscription 3 mai 2006 Dernière intervention - 31 mai 2005 à 21:03
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Dvdmizo
cs_Matt67 554 Messages postés samedi 6 septembre 2003Date d'inscription 6 mars 2010 Dernière intervention - 21 mai 2005 à 14:53
0
Utile
Bonjour,



Pas tres bien compris ta question...

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

Matt...
Commenter la réponse de cs_Matt67
SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention - 21 mai 2005 à 17:49
0
Utile
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 ?
Commenter la réponse de SnOOpss
cs_Matt67 554 Messages postés samedi 6 septembre 2003Date d'inscription 6 mars 2010 Dernière intervention - 22 mai 2005 à 11:22
0
Utile
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...
Commenter la réponse de cs_Matt67
SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention - 22 mai 2005 à 11:42
0
Utile
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).
Commenter la réponse de SnOOpss
cs_Matt67 554 Messages postés samedi 6 septembre 2003Date d'inscription 6 mars 2010 Dernière intervention - 22 mai 2005 à 16:02
0
Utile
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...
Commenter la réponse de cs_Matt67
SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention - 22 mai 2005 à 17:05
0
Utile
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 !!
Commenter la réponse de SnOOpss
cs_Matt67 554 Messages postés samedi 6 septembre 2003Date d'inscription 6 mars 2010 Dernière intervention - 22 mai 2005 à 19:51
0
Utile
Bonjour,



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

Tes octets tu les recuperes dans un fichier ?

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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.