[C] Gérer 'CHAR_BIT != 8' ?

Gérer 'CHAR_BIT != 8' ? [C] - C++ - Programmation

Marsh Posté le 18-12-2002 à 04:22:33    

Programmant d'habitude sous Windows, je suis en train de faire un petit soft et j'aimerais qu'il puisse tourner sur le plus de plateformes possibles.
 
J'arrive à résoudre les plus gros problèmes mais je me retrouve confronter à une question que je n'arrive pas à élucider :
Comment envoyer (en utilisant les sockets) une chaîne de caractères ASCII (caractères codés sur 8 bits allant de 0 à 127) sur des machines avec un type 'char' faisant plus de 8 bits ?
 
Par exemple, dans le cas d'un client HTTP, je vais envoyer la chaîne "GET / HTTP/1.0\r\nUser-Agent: monAgent/0.1a\r\nFrom: me@nowhere.org\r\n\r\n" à un serveur quelconque. La norme HTTP (dérivée de TELNET) indique qu'il faut envoyer les caractères sur 8 bits.
 
Donc sur les machines où un 'char' fait 8 bits, ça roule, je fais juste :

Code :
  1. char myRequest[] = "GET / HTTP/1.0\r\nUser-Agent: monAgent/0.1a\r\nFrom: me@nowhere.org\r\n\r\n"
  2. send( socket, (void *)myRequest, strlen( myRequest ), 0 ); // le 'void *' est juste là pour l'explication


 
Par contre sur les autres machines, je ne vois pas trop comment faire marcher cela... En effet, que va t'il se passer sur une machine où 'CHAR_BIT == 9' (par exemple) ? J'enverrais sur le réseau un bit de plus par caractère et le serveur à l'autre bout ne va jamais comprendre !
 
Je sais que ça n'a sûrement pas beaucoup d'importance, mais j'aimerais bien savoir comment je dois résoudre ce problème.
 
-- Edit : --
Après réflexion, je me suis dit que la fonction 'send' devait accepter la taille en 'char' plutôt qu'en octets. J'ai donc corrigé ce bug.
 
J'ai regardé le source d'Apache (qui est un soft porté sur de très nombreuses plateformes) et j'ai remarqué qu'à au moins un endroit ils envoient directement leur 'char *' au travers de 'send'. Donc a moins d'avoir des réponses, je vais assumer que c'est OK...


Message édité par gatorette le 18-12-2002 à 10:50:53

---------------
each day I don't die is cheating
Reply

Marsh Posté le 18-12-2002 à 04:22:33   

Reply

Marsh Posté le 11-01-2003 à 04:04:44    

(suite à un MP)

Citation :

Est-il nécessaire de faire un traîtement sur les chaînes de texte que l'on envoie au travers de sockets sur une machine ayant défini CHAR_BIT != 8 ?

Déjà, les tables de caractères pouvant être différentes, il devrait toujours y avoir au moins un traitement de traduction, même s'il est 'bidon'.
 

Citation :

Donc sur une machine où CHAR_BIT = 12, je dois faire ci-dessous ou bien tout est arrangé comme par magie par une couche en dessous (socket, pilotes réseau...) ?

Code :
  1. ...
  2. sent = msg[i] & 0xFF;
  3. ...


Ça c'est un traitement... minimaliste, qui peut tronquer et perdre des valeurs.
Il est probable que les fonctions d'envoi réseau fassent cela de toutes façons.
Mais je ne les connais absolument pas, c'est pour ça que je n'avais pas répondu à ton post.
 

Citation :

En fait, il semble que CHAR_BIT soit toujours égal à 8.

C'est faux, il peut être plus grand (mais pas plus petit).
Je l'ai lu dans de nombreux textes:
FAQ C.
Indian Hill Recommended C Style and Coding Standards, rubrique 'Portability'.
Mais c'est rare, même très rare.
Regardes déjà si les librairies que tu utilises sont portées sur de tels environnements.
Sinon c'est vraiment pas la peine de s'embêter, un simple '[i]assert(CHAR_BIT==8)' suffira.
 
Si tu développes du code très sérieux, où que tu veux transférer des données, c'est une autre histoire.
 
Je te souhaite une bonne pêche aux infos...


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 11-01-2003 à 13:19:47    

Musaran a écrit :

Citation :

En fait, il semble que CHAR_BIT soit toujours égal à 8.

C'est faux, il peut être plus grand (mais pas plus petit).


 
Oui, j'avais mal lu la page. En fait, c'est pour IEEE Std 1003.1-2001 (POSIX ?) que CHAR_BIT est toujours égal à 8 (voir cette page). Je ne suis pas un expert en normes, donc je ne sais pas quelle est l'importance (en nombre de compilateurs la respectant) de cette norme.
 

Musaran a écrit :

Sinon c'est vraiment pas la peine de s'embêter, un simple 'assert(CHAR_BIT==8)' suffira.
Si tu développes du code très sérieux, où que tu veux transférer des données, c'est une autre histoire.


 
C'est vrai que je me résigne pour le moment. Je ne programme pas un code 'sérieux' (je ne suis pas sûr qu'il aille plus loin que mon usage personnel), cependant je voulais essayer de le rendre le plus possible multiplateformes à titre d'exercice. Donc à moins que d'autres ne m'apportent d'autres informations, je vais me contenter d'un assert(CHAR_BIT == 8).

Reply

Sujets relatifs:

Leave a Replay

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