IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> Convertir de little-endian à big-endian
Options
Arty
posté 8 Aug 2004, 19:21
Message #1


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 1 599
Inscrit : 20 Sep 2003
Membre no 9 702



Existe-t-il des fonctions "standards" pour passer de little-endian à big-endian? Je voudrais que mon code soit portable au maximum.

Je sais qu'il existe htonl, htons, ntohl, ntohs dans la librairie standard pour passer de l'ordonance des octets du réseau à celui de la machine, mais ils ne font rien sur un PowerPC puisque c'est un big-endian...


--------------------
MacBook Pro 15" Core [email protected]
Mac OS 10.9.3
iPhone 5 - 32 Go Black
Go to the top of the page
 
+Quote Post
Driden
posté 8 Aug 2004, 20:09
Message #2


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 318
Inscrit : 7 May 2003
Lieu : Ile de France (92)
Membre no 7 472



QUOTE(Arty @ 8 Aug 2004, 20:21)
Je sais qu'il existe htonl, htons, ntohl, ntohs dans la librairie standard pour passer de l'ordonance des octets du réseau à celui de la machine, mais ils ne font rien sur un PowerPC puisque c'est un big-endian...
[right][snapback]803362[/snapback][/right]

Je comprends pas bien ou est ton problème si le codage n'a pas besoin d'etre modifié ?


--------------------

@+ Driden
Go to the top of the page
 
+Quote Post
Arty
posté 8 Aug 2004, 20:32
Message #3


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 1 599
Inscrit : 20 Sep 2003
Membre no 9 702



Moi j'ai besoin de convertir de big-endian à little-endian (et l'inverse), ce que ne font pas les fonctions que j'ai cité! En fait j'en ai parlé au cas où quelqu'un me fasse remarquer leur existence, mais ce ne sont pas celles qu'il me faut! wink.gif


--------------------
MacBook Pro 15" Core [email protected]
Mac OS 10.9.3
iPhone 5 - 32 Go Black
Go to the top of the page
 
+Quote Post
Driden
posté 8 Aug 2004, 20:41
Message #4


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 318
Inscrit : 7 May 2003
Lieu : Ile de France (92)
Membre no 7 472



Tu pourrais donner des détails sur l'applications, tu l'utilises via un reseau de machines d'architectures hétérogènes ?


--------------------

@+ Driden
Go to the top of the page
 
+Quote Post
cbrandt
posté 8 Aug 2004, 20:43
Message #5


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 291
Inscrit : 29 May 2004
Lieu : 48°50'27" N, 2°13'43" E
Membre no 19 336



question à tout hasard, serait-ce pour avoir des données numériques (entiers courts, longs...) dans un fichier qui serait compatible avec la version mac et windows de ton application ?


--------------------
Membre no. 14 du club des AIPBP (Anciens Inscrits Pas Beaucoup de Posts) Voir la liste
Go to the top of the page
 
+Quote Post
Arty
posté 8 Aug 2004, 21:54
Message #6


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 1 599
Inscrit : 20 Sep 2003
Membre no 9 702



QUOTE(cbrandt @ 8 Aug 2004, 21:43)
question à tout hasard, serait-ce pour avoir des données numériques (entiers courts, longs...) dans un fichier qui serait compatible avec la version mac et windows de ton application ?
[right][snapback]803435[/snapback][/right]

Oui! C'est ça.


--------------------
MacBook Pro 15" Core [email protected]
Mac OS 10.9.3
iPhone 5 - 32 Go Black
Go to the top of the page
 
+Quote Post
Driden
posté 8 Aug 2004, 21:58
Message #7


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 318
Inscrit : 7 May 2003
Lieu : Ile de France (92)
Membre no 7 472



QUOTE(Arty @ 8 Aug 2004, 22:54)
QUOTE(cbrandt @ 8 Aug 2004, 21:43)
question à tout hasard, serait-ce pour avoir des données numériques (entiers courts, longs...) dans un fichier qui serait compatible avec la version mac et windows de ton application ?
[right][snapback]803435[/snapback][/right]

Oui! C'est ça.
[right][snapback]803498[/snapback][/right]

T'as pas besoin de te préoccuper de ça normalement la machine bosse sur sa propre représentation des données.


--------------------

@+ Driden
Go to the top of the page
 
+Quote Post
cbrandt
posté 8 Aug 2004, 23:10
Message #8


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 291
Inscrit : 29 May 2004
Lieu : 48°50'27" N, 2°13'43" E
Membre no 19 336



QUOTE
T'as pas besoin de te préoccuper de ça normalement la machine bosse sur sa propre représentation des données.

SI ! Il FAUT s'en préoccuper, si on veut qu'un document de l'application soit identique dans les deux environnements.

Alors voilà la solution:
considère ton fichier comme le réseau. Donc dans les DEUX versions, mac et pc, utilise htonl et htons juste avant d'écrire un entier dans le fichier, et ntohl et ntohs juste après avoir lu un entier du fichier.
Sur un mac ça ne fera certes rien, mais sur un pc ça fera les conversions. Et ton source sera identique.
[EDIT]
Par contre, pour les nombres non-entiers, il se pourrait que les différences de codage ne soient pas uniquement liées au problème big-endian/little-endian. Pour ce cas là je n'ai pas de solution toute prête... smile.gif
[/EDIT]

Ce message a été modifié par cbrandt - 8 Aug 2004, 23:13.


--------------------
Membre no. 14 du club des AIPBP (Anciens Inscrits Pas Beaucoup de Posts) Voir la liste
Go to the top of the page
 
+Quote Post
Driden
posté 8 Aug 2004, 23:14
Message #9


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 318
Inscrit : 7 May 2003
Lieu : Ile de France (92)
Membre no 7 472



QUOTE(cbrandt @ 9 Aug 2004, 00:10)
QUOTE
T'as pas besoin de te préoccuper de ça normalement la machine bosse sur sa propre représentation des données.

SI ! Il FAUT s'en préoccuper, si on veut qu'un document de l'application soit identique dans les deux environnements.

[right][snapback]803561[/snapback][/right]

On s'est pas compris je crois wink.gif , je parlais des données internes au programme et non pas de données extraites d'un fichier. En effet dans ce cas il faut faire attention à la representation pour que ça reste compatible.


--------------------

@+ Driden
Go to the top of the page
 
+Quote Post
dulrich
posté 8 Aug 2004, 23:23
Message #10


Méchant modérateur paranoïaque
*****

Groupe : Modérateurs
Messages : 10 755
Inscrit : 24 Jan 2002
Lieu : Confoederatio Helvetica, Kanton Wallis
Membre no 1 865



je pige pas très bien, ce genre de différence n'est pas gérer directement dans les bibliothèques du langage lors de l'écriture dans un fichier (genre un fwrite)?


--------------------
Nothing Else Matters
Go to the top of the page
 
+Quote Post
Arty
posté 9 Aug 2004, 00:54
Message #11


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 1 599
Inscrit : 20 Sep 2003
Membre no 9 702



OK, merci pour l'idée de choisir une convention au départ qui me permette d'utiliser les fonctions htonl, etc...

QUOTE(dulrich1 @ 9 Aug 2004, 00:23)
je pige pas très bien, ce genre de différence n'est pas gérer directement dans les bibliothèques du langage lors de l'écriture dans un fichier (genre un fwrite)?
[right][snapback]803581[/snapback][/right]

Non, là on parle du codage dans les fichiers. Comme l'a dit Driden, pour toutes les données internes au programme on s'en fiche puisque tout est géré de manière transparente, mais dès que tu écris tes données dans un fichier que tu veux échanger avec un autre environnement, il a le risque qu'il ne soit pas lu de la même manière.


--------------------
MacBook Pro 15" Core [email protected]
Mac OS 10.9.3
iPhone 5 - 32 Go Black
Go to the top of the page
 
+Quote Post
dulrich
posté 9 Aug 2004, 02:38
Message #12


Méchant modérateur paranoïaque
*****

Groupe : Modérateurs
Messages : 10 755
Inscrit : 24 Jan 2002
Lieu : Confoederatio Helvetica, Kanton Wallis
Membre no 1 865



ayant eu affaire à ce genre de chose (dump de la mémoire d'un prog dans un fichier) et n'ayant jamais pris en considération ce genre de problème, je ne comprends toujours pas.


Soit tu balance quelque chose dans un fichier, et tu veux que lors de la lecture de ce fichier il n'y ait pas de problème sur une autre architecture. Je connais les endians...
Mais la plupart des fonctions d'écritures dans un fichier n'ont-elles pas une convention justement? Histoire que le transfert sur une uatre plateforme fonctionne?


--------------------
Nothing Else Matters
Go to the top of the page
 
+Quote Post
SuperCed
posté 9 Aug 2004, 09:25
Message #13


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 831
Inscrit : 19 Jul 2001
Lieu : Живим у Греноблу
Membre no 519



Je sais qu'il existe une fonction qui fait ça dans les socket BSD je crois. En fait, dans le cas d'un PowerPC, la fonction de fait rien, mais sur du Intel, ça fait la transformation.

Il faut toujours le faire quand tu utilises les sockets BSD et que tu veux un code portable.

Attends que je retrouve...

Je crois que c'est ça :

CODE

#include <netinet/in.h>

long htonl(u_long x);
short htons(u_short x);
u_long ntohl(u_long x);
u_short ntohs(u_short x);


En effet, les données transitant sur le net doivent être en big indian.


--------------------
Хајде Јано коло да играмо
iMac 27 mi 2010
Macbook air mi 2011
Mac Mini M1
Go to the top of the page
 
+Quote Post
Arty
posté 9 Aug 2004, 10:09
Message #14


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 1 599
Inscrit : 20 Sep 2003
Membre no 9 702



QUOTE(SuperCed @ 9 Aug 2004, 10:25)
Je sais qu'il existe une fonction qui fait ça dans les socket BSD je crois. En fait, dans le cas d'un PowerPC, la fonction de fait rien, mais sur du Intel, ça fait la transformation.

Il faut toujours le faire quand tu utilises les sockets BSD et que tu veux un code portable.

Attends que je retrouve...

Je crois que c'est ça :

CODE
#include <netinet/in.h>long htonl(u_long x);short htons(u_short x);u_long ntohl(u_long x);u_short ntohs(u_short x);


En effet, les données transitant sur le net doivent être en big indian.
[right][snapback]803792[/snapback][/right]

Oui, oui, je sais, j'en ai parlé plus haut wink.gif


--------------------
MacBook Pro 15" Core [email protected]
Mac OS 10.9.3
iPhone 5 - 32 Go Black
Go to the top of the page
 
+Quote Post
f_cam
posté 9 Aug 2004, 10:21
Message #15


Moderating Daemon
*****

Groupe : Modérateurs
Messages : 6 345
Inscrit : 22 Feb 2004
Lieu : Yvelines/Cambridge (GB), dans mon pantalon
Membre no 15 207



QUOTE(dulrich1 @ 9 Aug 2004, 03:38)
ayant eu affaire à ce genre de chose (dump de la mémoire d'un prog dans un fichier) et n'ayant jamais pris en considération ce genre de problème, je ne comprends toujours pas.


Soit tu balance quelque chose dans un fichier, et tu veux que lors de la lecture de ce fichier il n'y ait pas de problème sur une autre architecture. Je connais les endians...
Mais la plupart des fonctions d'écritures dans un fichier n'ont-elles pas une convention justement? Histoire que le transfert sur une uatre plateforme fonctionne?
[right][snapback]803665[/snapback][/right]

Pas à ma connaissance (en C du moins). Un truc comme fwrite il prends une série de octets à écrire et il le fait dans le même ordre que les octets sont stoqués en mémoire. Si tu lui donne 8 octets il n'a aucun moyen de savoir si c'est un entier ou float sur 8 octets, une chaine de charactères de 8 octets, un entier sur 4 octets et 2 autres sur 2 octets etc....
Pareil fread lit un flux d'octets, sans aucune connaissance de leur type.


--------------------
G5 Bi 2GHz rev A, ATI X800 XT
Alu 17" rev A
MacBook core duo 1.83 GHz
Go to the top of the page
 
+Quote Post
Bac's
posté 9 Aug 2004, 14:08
Message #16


Tendance cubiste
*****

Groupe : Membres
Messages : 1 595
Inscrit : 17 Sep 2003
Lieu : Là où ce qui tombe des arbres à l'automne commence par 'F' et finit par 'n'
Membre no 9 643



Je ne comprends toujours pas où tu veux en venir. Si tu veux que la représentation mémoire de tes données soit celle du processeur et que les fichiers créés par ton application soient indépendants de la plate-forme, la solution de cbrandt est la bonne.

Tu peux même avoir une représentation encore plus indépendante (qui tienne compte des différences de taille par exemple) en utilisant les fonctions XDR (eXternal Data Representation).


--------------------
G5 1,6GHz 1 270Mo RAM OS/X 10.4.1 + STHome Hyper-Bidouillé

C'est à force de rater que l'on finit par réussir. Devise Shadok.


[Editus moderatus]Plus de bannières merci... [Editus Bacsus]Oui chef, bien chef !
Go to the top of the page
 
+Quote Post
f_cam
posté 9 Aug 2004, 14:14
Message #17


Moderating Daemon
*****

Groupe : Modérateurs
Messages : 6 345
Inscrit : 22 Feb 2004
Lieu : Yvelines/Cambridge (GB), dans mon pantalon
Membre no 15 207



Et si le format de fichier a été défini sur pc, par quelqu'un qui n'a pas pris le soin d'utiliser htonl et cie?


--------------------
G5 Bi 2GHz rev A, ATI X800 XT
Alu 17" rev A
MacBook core duo 1.83 GHz
Go to the top of the page
 
+Quote Post
Bac's
posté 9 Aug 2004, 14:55
Message #18


Tendance cubiste
*****

Groupe : Membres
Messages : 1 595
Inscrit : 17 Sep 2003
Lieu : Là où ce qui tombe des arbres à l'automne commence par 'F' et finit par 'n'
Membre no 9 643



QUOTE(f_cam @ 9 Aug 2004, 15:14)
Et si le format de fichier a été défini sur pc, par quelqu'un qui n'a pas pris le soin d'utiliser htonl et cie?
[right][snapback]804074[/snapback][/right]
Ben voilà, on y arrive !! smile.gif

Si tu as un entier sur 16 bits, tu peux faire la manipe suivante :
CODE
unsigned short val;

read(fd, &val, sizeof(val));
val = val >> 8 | val << 8;
Pour du 32 bits, ce serait :
CODE
unsigned int val;

read(fd, &val, sizeof(val));
val = val >> 24  | (val & 0xFF0000) >> 8 | (val & 0xFF00) << 8 | val << 24;
Dans le deux cas, tu peux de fendre d'une fonction si tu veux quitte à la déclarer inline.

Ce message a été modifié par Bac's - 9 Aug 2004, 14:56.


--------------------
G5 1,6GHz 1 270Mo RAM OS/X 10.4.1 + STHome Hyper-Bidouillé

C'est à force de rater que l'on finit par réussir. Devise Shadok.


[Editus moderatus]Plus de bannières merci... [Editus Bacsus]Oui chef, bien chef !
Go to the top of the page
 
+Quote Post
Arty
posté 9 Aug 2004, 16:42
Message #19


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 1 599
Inscrit : 20 Sep 2003
Membre no 9 702



QUOTE(Bac's @ 9 Aug 2004, 15:55)
QUOTE(f_cam @ 9 Aug 2004, 15:14)
Et si le format de fichier a été défini sur pc, par quelqu'un qui n'a pas pris le soin d'utiliser htonl et cie?
[right][snapback]804074[/snapback][/right]
Ben voilà, on y arrive !! smile.gif

Si tu as un entier sur 16 bits, tu peux faire la manipe suivante :
CODE
unsigned short val;

read(fd, &val, sizeof(val));
val = val >> 8 | val << 8;
Pour du 32 bits, ce serait :
CODE
unsigned int val;

read(fd, &val, sizeof(val));
val = val >> 24  | (val & 0xFF0000) >> 8 | (val & 0xFF00) << 8 | val << 24;
Dans le deux cas, tu peux de fendre d'une fonction si tu veux quitte à la déclarer inline.
[right][snapback]804106[/snapback][/right]

On est d'accord, ca revient au même. Mais pour l'écriture dans un fichier, il faut bien choisir une convention au départ, d'où la bonne technique proposée par cbrandt.


--------------------
MacBook Pro 15" Core [email protected]
Mac OS 10.9.3
iPhone 5 - 32 Go Black
Go to the top of the page
 
+Quote Post
p3consulting
posté 12 Aug 2004, 14:38
Message #20


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 675
Inscrit : 13 Dec 2003
Membre no 12 468



QUOTE(Arty @ 8 Aug 2004, 19:21)
Existe-t-il des fonctions "standards" pour passer de little-endian à big-endian? Je voudrais que mon code soit portable au maximum.

Je sais qu'il existe htonl, htons, ntohl, ntohs dans la librairie standard pour passer de l'ordonance des octets du réseau à celui de la machine, mais ils ne font rien sur un PowerPC puisque c'est un big-endian...
[right][snapback]803362[/snapback][/right]


Tout est dans ce header:
#include <architecture/byte_order.h>
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 28th April 2024 - 04:35