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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°271902
gatorette
Posté le 18-12-2002 à 04:22:33  profilanswer
 

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
mood
Publicité
Posté le 18-12-2002 à 04:22:33  profilanswer
 

n°283975
Musaran
Cerveaulté
Posté le 11-01-2003 à 04:04:44  profilanswer
 

(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
n°284066
gatorette
Posté le 11-01-2003 à 13:19:47  profilanswer
 

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


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

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

 

Sujets relatifs
Comment faire un log pour gerer une videotheque en flash ou ????Gerer INTERNET EXPLORER et evoyer des SendKeys
Lancer IE mais impossible de gerer la fin du chargement de la page !Fonctions pour passer un int vers un char et une chaine vers un int ?
char buf[255] ou char buf[256] ?C++ : delete d'un char * : quelle est la bonne solution ?
Gérer les retours à la ligne avec des include ou readfile....Formatage date sous ORACLE et PHP [Resolu avec TO_CHAR]
gérer rubrique et sous rubriques.... avec un ForString To Char Help
Plus de sujets relatifs à : [C] Gérer 'CHAR_BIT != 8' ?


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