conversion little endian big endian et viceversa [C/reseau] - C++ - Programmation
Marsh Posté le 19-03-2003 à 13:18:55
dans la norme ISO, c'est la couche présentation qui fait ca...
mais la, tu pars quasi from scratch donc tu dois le faire toi-meme...désolé...
Marsh Posté le 19-03-2003 à 13:19:42
cooltwan a écrit : Quelqu'un a les routine pour faire ça |
pour les entiers sur 32 bits
man htonl
man ntohl
pour les entiers sur 16 bits
man htons
man ntohs
Marsh Posté le 19-03-2003 à 13:19:48
pour les int c'est facile (d'ailleurs avec htonl etc c'est deja fait) mais pour les float je vais pleurer
Marsh Posté le 19-03-2003 à 13:21:50
Pour faire ça, tu as les fonctions ntohl et htonl pour les u_longs et ntohs et htons pour les u_shorts.
Marsh Posté le 19-03-2003 à 13:23:41
gatorette a écrit : Pour faire ça, tu as les fonctions ntohl et htonl pour les u_longs et ntohs et htons pour les u_shorts. |
et pour les floats je fais comment ?
Marsh Posté le 19-03-2003 à 13:27:46
Pour les float c'est pareil
C'est la donnee qui est inverse
T'echange les octets
Marsh Posté le 19-03-2003 à 14:27:45
cooltwan a écrit : Quelqu'un a les routine pour faire ça |
Il existe existe une bibliothèque pour ça : XDR (genre external data representation), C'est une norme internationale.
Le binding C est une merde sans nom (qui finalement s'itègre bien dans le langage).
C'est la partie présentation des RPC.
Marsh Posté le 19-03-2003 à 20:09:53
de toute façon le prof veut qu'on fasse les routines nous memes donc on va faire mumuse pour remettre les octets dans le bon ordre sans compter que le client est sur une becane 64 bit et le serv sur une plateforme 32 bits
Marsh Posté le 19-03-2003 à 20:23:51
le serveur doit modifier avec des operations style +1 les champs du message donc pas possible
Marsh Posté le 20-03-2003 à 07:11:17
Code :
|
Marsh Posté le 21-03-2003 à 14:11:09
c bizarre quand je fais printf de sizeof d'un entier sur le serveur 64 bits j'ai que 4 octets soit 32 bits ???
(serveur dec qlpha)
#include <stdio.h>
main()
{
int i=2;
printf("taille d'un entier %d",sizeof(i));
}
1010 amagnier vega:~> cc -o taille taille.c
1011 amagnier vega:~> taille
taille d'un entier 4
1012 amagnier vega:~>
Marsh Posté le 21-03-2003 à 14:19:35
ok j'ai trouve merci
"
Note : Remarquez que, d'après ce qui précède, le type int devrait être codé sur 64 bits sur les machines 64 bits. Le type long int devant lui être supérieur, il doit également être codé sur 64 bits ou plus. Le type short int peut alors être sur 16 ou sur 32 bits. Il n'existe donc pas, selon la norme, de type permettant de manipuler les valeurs 16 bits sur les machines 64 bits si le type short int est codé sur 32 bits, ou, inversement, de type permettant de manipuler les valeurs 32 bits si le type short int est codé sur 16 bits.
Afin de résoudre ces problèmes, la plupart des compilateurs brisent la règle selon laquelle le type int est le type des entiers natifs du processeur, et fixent sa taille à 32 bits quelle que soit l'architecture utilisée. Ainsi, le type short est toujours codé sur 16 bits, le type int sur 32 bits et le type long sur 32 ou 64 bits selon que l'architecture de la machine est 32 ou 64 bits. Autrement dit, le type qui représente les entiers nativement n'est plus le type int, mais le type long. Cela ne change pas les programmes 32 bits, puisque ces deux types sont identiques dans ce cas. Les programmes destinés aux machines 64 bits pourront quant à eux être optimisés en utilisant le type long à chaque fois que l'on voudra utiliser le type de données natif de la machine cible. Les programmes 16 bits en revanchent ne sont en revanche plus compatibles avec ces règles, mais la plupart des compilateurs actuels ne permettent plus de compiler des programmes 16 bits de toutes manières.
"
a mon avis y a une coquille dans le sujet et le deuxieme champ du message doit surement etreun long
Marsh Posté le 21-03-2003 à 15:44:14
niveau code je fais faire bourrain avec un truc style:
Code :
|
Marsh Posté le 22-03-2003 à 23:47:01
pourtant ça marche l'inversion des octets chez moi je viens de tester tout ça
Marsh Posté le 22-03-2003 à 23:54:25
gatorette a écrit : Ca ne marchera pas ! En effet, il faut intervertir les bits et pas les octets ! |
La conversion little endian/big endian, ca concerne les octets, pas les bits
(au moins sur les entiers)
Marsh Posté le 23-03-2003 à 01:17:18
mrBebert a écrit : |
de toute façon les bits ne sont pas adressables
donc on se fiche dans quel ordre ils sont envoyés
(sauf si tu fais vraiment du bas niveau...)
LeGreg
Marsh Posté le 24-03-2003 à 09:40:37
mrBebert a écrit : |
Oui... je me suis rendu compte de ma connerie vendredi soir et évidemment pas d'accès internet du week-end.
Note to myself: Toujours tourner dix fois les doigts dans sa bouche avant de répondre...
Pour me rattraper (si c'est encore possible), voila deux codes de conversion un peu particuliers (ça marche chez moi, mais je ne recommande pas leur utilisation) :
Code :
|
Si vous voulez plus d'infos sur le "stupid xor trick", allez voir ici.
Marsh Posté le 15-09-2003 à 20:48:31
J'AI UN PROBLEME AVEC UN FLOTANT :
Dans un fichier binaire écris sous sun : 00 00 40 40 ça donne quoi comme flottant sous Windows d'aprés vous ???
merci de m'aider ..
Marsh Posté le 19-03-2003 à 13:12:20
Quelqu'un a les routine pour faire ça
car je transmet via des sockets udp un message qui contient des float, des int et des doubles avec un client little endian et un serveur en big endian qui doit faire des operations style addition sur le message reçu et les renvoyer au client ?
"
Le client et le serveur vont échanger un message ayant la structure suivante :
+---------------+
| integer |
+---------------+
| chaine 8 car. |
| |
+---------------+
| integer |
+---------------+
| float |
+---------------+
| double |
| |
+---------------+
Le client initialise la structure, l'envoie au serveur. Le serveur imprime ce qu'il a reçu, modifie le contenu, et le renvoie au client qui imprime ce qu'il reçoit en retour.
"
Message édité par cooltwan le 19-03-2003 à 13:27:23