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

un char *data se termine toujours par un \0 ? - C++ - Programmation

Marsh Posté le 06-04-2011 à 14:42:02    

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

Reply

Marsh Posté le 06-04-2011 à 14:42:02   

Reply

Marsh Posté le 06-04-2011 à 14:49:10    

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
Reply

Marsh Posté le 06-04-2011 à 15:17:20    

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

Reply

Marsh Posté le 06-04-2011 à 15:46:16    

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
Reply

Marsh Posté le 06-04-2011 à 15:51:39    

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 ...

Reply

Marsh Posté le 06-04-2011 à 15:56:36    

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
Reply

Marsh Posté le 06-04-2011 à 16:05:29    

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é!  --
Reply

Marsh Posté le 06-04-2011 à 16:12:41    

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
Reply

Marsh Posté le 06-04-2011 à 16:39:53    

Ca marche très bien :)
Merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed