Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1704 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  un char *data se termine toujours par un \0 ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

un char *data se termine toujours par un \0 ?

n°2068414
razuki
Posté le 06-04-2011 à 14:42:02  profilanswer
 

Bonjour,
J'aimerais savoir si un char *data doit toujours se terminer par un \0 peu importe la situation ?
Par exemple, j'utilise la bibliothèque openssl qui manipule des char*. Mais dans la doc d'openssl, concernant la fonction int BN_bn2bin(const BIGNUM *a, unsigned char *to); ( http://www.openssl.org/docs/crypto/BN_bn2bin.html) il n'est pas précisé que char doit se terminer par un \0.
Cette fonction est utilisée pour stocker un grand nombre "BIGNUM a" dans une mémoire pointée par "char* to". "char* to" doit etre allouée au préalable.
BN_num_bytes(a) renvoie la taille occupée par BIGNUM a
Est ce que je dois faire un :
char* u_data = new unsigned char[BN_num_bytes(a)+1] ou sans le +1
Merci d'avance

mood
Publicité
Posté le 06-04-2011 à 14:42:02  profilanswer
 

n°2068416
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 06-04-2011 à 14:49:10  profilanswer
 

Le mieux dans ce genre de cas est de se demander: Qu'auraient fait les développeurs de la lib ?
 
S'ils ne mettent pas de \0, comment tu vas trouver la fin de ton nombre ? Tu ne peux pas connaître sa "taille" en termes de char à l'avance (enfin, pas simplement). Donc même si je peux me tromper, je suis certain que la lib va te mettre un \0 dans ton char *to.
 
Et dans le cas contraire j'imagine que ça serait précisé, tout simplement. Par convention, on termine toujours les chaînes de caractères par un \0. Les seuls char * non null terminated sont ceux contenant des données non ASCII (des buffers ou que sais-je) [:spamafote]


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
n°2068430
razuki
Posté le 06-04-2011 à 15:17:20  profilanswer
 

Dans la doc, c'est écrit :

Code :
  1. int BN_bn2bin(const BIGNUM *a, unsigned char *to);


BN_bn2bin() converts the absolute value of a into big-endian form and stores it at to. to must point to BN_num_bytes(a) bytes of memory.  
La doc me demande d'allouer au préalable une memoire qui sera pointée par  char *to. La taille de cette mémoire doit faire BN_num_bytes(a) bytes c'est à dire la taille du BIGNUM a. En fait je pense que le dernier caractère dans char *to n'est pas \0. Comme la lib peut rajouter un \0 alors que la taille allouée n'est pas prévue pour un \0 à la fin de char* to ... ? Je suis un peu confus

n°2068445
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 06-04-2011 à 15:46:16  profilanswer
 

razuki a écrit :

Dans la doc, c'est écrit :

Code :
  1. int BN_bn2bin(const BIGNUM *a, unsigned char *to);


BN_bn2bin() converts the absolute value of a into big-endian form and stores it at to. to must point to BN_num_bytes(a) bytes of memory.
La doc me demande d'allouer au préalable une memoire qui sera pointée par  char *to. La taille de cette mémoire doit faire BN_num_bytes(a) bytes c'est à dire la taille du BIGNUM a. En fait je pense que le dernier caractère dans char *to n'est pas \0. Comme la lib peut rajouter un \0 alors que la taille allouée n'est pas prévue pour un \0 à la fin de char* to ... ? Je suis un peu confus


Alors dans ce cas il est effectivement possible que la fonction ne mette pas de \0, tout simplement (j'avais pas lu la doc :D)

 

De toutes façons, tu te prends la tête pour rien. Fais un test simple: Alloue un espace mémoire de la taille de ton nombre +1, et fais un memset d'une valeur arbitraire, disons 1 ou 2.

 

Ensuite exécutes ta fonction, et vois si le dernier octet (en surplus) est nul (0) ou a gardé ta valeur arbitraire. Voilà problème réglé :D

 

Mais effectivement de toute façon vu la doc, et vu qu'avec BN_num_bytes tu peux connaître à l'avance la taille de ton nombre simplement (EDIT :Et c'était marqué dans ton post, désolé j'avais pas vu [:ddr555]) (contrairement à ce que j'affirmais plus haut :jap: ) ça me semble assez explicite sur le fait qu'il ne met pas de \0. :D


Message édité par WiiDS le 06-04-2011 à 15:47:00

---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
n°2068446
razuki
Posté le 06-04-2011 à 15:51:39  profilanswer
 

D'accord. Maintenant, mon problème c'est comment concaténer deux chaines binaires. je peux pas utiliser strcat et compagnie car mes mes chaines ne se terminent pas par \0 ...

n°2068448
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 06-04-2011 à 15:56:36  profilanswer
 

razuki a écrit :

D'accord. Maintenant, mon problème c'est comment concaténer deux chaines binaires. je peux pas utiliser strcat et compagnie car mes mes chaines ne se terminent pas par \0 ...


Tu as deux solutions:
 
1) Tu te fais ton propre strcat (après tout, c'est pas une fonction très compliquée) qui prend en paramètre la chaine de destination, la chaine source, la taille de la chaine de destination et éventuellement la taille de la chaine de source si tu ne la connais pas. Ca c'est la solution "Je veux vraiment pas mettre de \0 :o"
2) Tu alloues bel et bien BN_num_bytes(a), tu exécutes ta fonction et tu mets toi même le \0 avec un to[BN_num_bytes(a) - 1] = '\0'; et là, tu pourras utiliser sans problèmes les fonctions de la libc


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
n°2068450
gilou
Modérateur
Modzilla
Posté le 06-04-2011 à 16:05:29  profilanswer
 

razuki a écrit :

D'accord. Maintenant, mon problème c'est comment concaténer deux chaines binaires. je peux pas utiliser strcat et compagnie car mes mes chaines ne se terminent pas par \0 ...


1) tu alloues la bonne taille pour la destination
2) void * memcpy ( void * destination, const void * source, size_t num ); pour la première chaine
2) idem pour la 2e, en copiant a la fin de ce qui vient d'être mis
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2068452
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 06-04-2011 à 16:12:41  profilanswer
 

gilou a écrit :


1) tu alloues la bonne taille pour la destination
2) void * memcpy ( void * destination, const void * source, size_t num ); pour la première chaine
2) idem pour la 2e, en copiant a la fin de ce qui vient d'être mis
A+,


Pas con le memcpy :D


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
n°2068467
razuki
Posté le 06-04-2011 à 16:39:53  profilanswer
 

Ca marche très bien :)
Merci


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  un char *data se termine toujours par un \0 ?

 

Sujets relatifs
Problème return char.problème d'affectation de char
Somme des valeurs Algo quand la saisie est terminéquestion sur les char *
Récupérer les mots séparés par des espaces dans une chaîne de char....Déclaration de tableau de char
convertir une chaine de char en entier[Résolu]Union?
conversion UINT->charChar vs Vector
Plus de sujets relatifs à : un char *data se termine toujours par un \0 ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR