SnOOpss
Messages postés571Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 5 décembre 2013
-
20 mai 2005 à 18:45
SnOOpss
Messages postés571Date d'inscriptionsamedi 3 avril 2004StatutMembreDerniè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
Dvdmizo
Messages postés74Date d'inscriptionjeudi 6 mars 2003StatutMembreDerniè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
SnOOpss
Messages postés571Date d'inscriptionsamedi 3 avril 2004StatutMembreDerniè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 !!
SnOOpss
Messages postés571Date d'inscriptionsamedi 3 avril 2004StatutMembreDerniè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é !!
SnOOpss
Messages postés571Date d'inscriptionsamedi 3 avril 2004StatutMembreDerniè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)