Bonjour,
Je veux lire un fichier dans un format binaire bien documenté, or la
documentation de ce format me dit que toutes les valeurs numériques sont
stockées en "network byte order", c'est-à-dire big endian si j'ai bien
compris.
Pour lire ces données numériques, j'ai donc pensé aux fonctions de la
série htonl, nltoh etc. dont j'ai entendu parler ici. J'ai donc lu les
manpages de ces fonctions, et deux problèmes se posent à moi :
1/ ce sont des fonctions de la norme BSD.
2/ elles ne permettent de traduire que des types entiers et non des
flottants.
Je me demandais donc si vous connaissiez une autre alternative pour
effectuer la traduction, ou bien si je vais être obligé d'écrire mes
propres routines de conversions.
Hors bibliothèque spécifiquement orientée TCP/IP, vous êtes de toutes
Bonjour,
Je veux lire un fichier dans un format binaire bien documenté, or la
documentation de ce format me dit que toutes les valeurs numériques sont
stockées en "network byte order", c'est-à-dire big endian si j'ai bien
compris.
Pour lire ces données numériques, j'ai donc pensé aux fonctions de la
série htonl, nltoh etc. dont j'ai entendu parler ici. J'ai donc lu les
manpages de ces fonctions, et deux problèmes se posent à moi :
1/ ce sont des fonctions de la norme BSD.
2/ elles ne permettent de traduire que des types entiers et non des
flottants.
Je me demandais donc si vous connaissiez une autre alternative pour
effectuer la traduction, ou bien si je vais être obligé d'écrire mes
propres routines de conversions.
Hors bibliothèque spécifiquement orientée TCP/IP, vous êtes de toutes
Bonjour,
Je veux lire un fichier dans un format binaire bien documenté, or la
documentation de ce format me dit que toutes les valeurs numériques sont
stockées en "network byte order", c'est-à-dire big endian si j'ai bien
compris.
Pour lire ces données numériques, j'ai donc pensé aux fonctions de la
série htonl, nltoh etc. dont j'ai entendu parler ici. J'ai donc lu les
manpages de ces fonctions, et deux problèmes se posent à moi :
1/ ce sont des fonctions de la norme BSD.
2/ elles ne permettent de traduire que des types entiers et non des
flottants.
Je me demandais donc si vous connaissiez une autre alternative pour
effectuer la traduction, ou bien si je vais être obligé d'écrire mes
propres routines de conversions.
Hors bibliothèque spécifiquement orientée TCP/IP, vous êtes de toutes
Bonjour,
Je veux lire un fichier dans un format binaire bien documenté, or la
documentation de ce format me dit que toutes les valeurs numériques sont
stockées en "network byte order", c'est-à-dire big endian si j'ai bien
compris.
Pour lire ces données numériques, j'ai donc pensé aux fonctions de la
série htonl, nltoh etc. dont j'ai entendu parler ici. J'ai donc lu les
manpages de ces fonctions, et deux problèmes se posent à moi :
1/ ce sont des fonctions de la norme BSD.
De toute façon, si vous faites une application réseaux, vous serez
Bonjour,
Je veux lire un fichier dans un format binaire bien documenté, or la
documentation de ce format me dit que toutes les valeurs numériques sont
stockées en "network byte order", c'est-à-dire big endian si j'ai bien
compris.
Pour lire ces données numériques, j'ai donc pensé aux fonctions de la
série htonl, nltoh etc. dont j'ai entendu parler ici. J'ai donc lu les
manpages de ces fonctions, et deux problèmes se posent à moi :
1/ ce sont des fonctions de la norme BSD.
De toute façon, si vous faites une application réseaux, vous serez
Bonjour,
Je veux lire un fichier dans un format binaire bien documenté, or la
documentation de ce format me dit que toutes les valeurs numériques sont
stockées en "network byte order", c'est-à-dire big endian si j'ai bien
compris.
Pour lire ces données numériques, j'ai donc pensé aux fonctions de la
série htonl, nltoh etc. dont j'ai entendu parler ici. J'ai donc lu les
manpages de ces fonctions, et deux problèmes se posent à moi :
1/ ce sont des fonctions de la norme BSD.
De toute façon, si vous faites une application réseaux, vous serez
De toute façon, si vous faites une application réseaux, vous serez
obligé d'utiliser des fonctions spécifiques à votre systeme d'exploitation.
AG
De toute façon, si vous faites une application réseaux, vous serez
obligé d'utiliser des fonctions spécifiques à votre systeme d'exploitation.
AG
De toute façon, si vous faites une application réseaux, vous serez
obligé d'utiliser des fonctions spécifiques à votre systeme d'exploitation.
AG
Hors bibliothèque spécifiquement orientée TCP/IP, vous êtes de toutes
façons obligé de faire des tests/hypothèses.
doit être IEEE754.
mémoire d'un entier et d'un flottant de même taille suivent les même
règles, vous pourriez essayer d'utiliser htonl, nltoh etc. si par
exemple sizeof(int) == sizeof(float). Mais ça semble bien foireux.
Si vous acceptez qu'il n'existe que des machines grand-boutiennes qui
vont lire directement vos binaires, et des machines petit-boutiennes
sur la base du char, à la fois pour les flottants et les entiers, il
n'y a qu'un test et une fonction à écrire:
unsigned char * AjusteBig2Little(unsigned char * zone, size_t n)
{
unsigned char tempo;
int i = 0;
int j = n-1;
assert( zone != NULL && n > 0);
while (i < j)
{
tempo = zone[i];
zone[i] = zone[j];
zone[j] = tempo;
i++, j--;
}
return zone;
}
#define AJUSTEBIG2LITTLE(var) AjusteBig2Little((unsigned char*)&var,
sizeof(var))
(on peut ne pas aimer le retour unsigned char * et le #define).
Hors bibliothèque spécifiquement orientée TCP/IP, vous êtes de toutes
façons obligé de faire des tests/hypothèses.
doit être IEEE754.
mémoire d'un entier et d'un flottant de même taille suivent les même
règles, vous pourriez essayer d'utiliser htonl, nltoh etc. si par
exemple sizeof(int) == sizeof(float). Mais ça semble bien foireux.
Si vous acceptez qu'il n'existe que des machines grand-boutiennes qui
vont lire directement vos binaires, et des machines petit-boutiennes
sur la base du char, à la fois pour les flottants et les entiers, il
n'y a qu'un test et une fonction à écrire:
unsigned char * AjusteBig2Little(unsigned char * zone, size_t n)
{
unsigned char tempo;
int i = 0;
int j = n-1;
assert( zone != NULL && n > 0);
while (i < j)
{
tempo = zone[i];
zone[i] = zone[j];
zone[j] = tempo;
i++, j--;
}
return zone;
}
#define AJUSTEBIG2LITTLE(var) AjusteBig2Little((unsigned char*)&var,
sizeof(var))
(on peut ne pas aimer le retour unsigned char * et le #define).
Hors bibliothèque spécifiquement orientée TCP/IP, vous êtes de toutes
façons obligé de faire des tests/hypothèses.
doit être IEEE754.
mémoire d'un entier et d'un flottant de même taille suivent les même
règles, vous pourriez essayer d'utiliser htonl, nltoh etc. si par
exemple sizeof(int) == sizeof(float). Mais ça semble bien foireux.
Si vous acceptez qu'il n'existe que des machines grand-boutiennes qui
vont lire directement vos binaires, et des machines petit-boutiennes
sur la base du char, à la fois pour les flottants et les entiers, il
n'y a qu'un test et une fonction à écrire:
unsigned char * AjusteBig2Little(unsigned char * zone, size_t n)
{
unsigned char tempo;
int i = 0;
int j = n-1;
assert( zone != NULL && n > 0);
while (i < j)
{
tempo = zone[i];
zone[i] = zone[j];
zone[j] = tempo;
i++, j--;
}
return zone;
}
#define AJUSTEBIG2LITTLE(var) AjusteBig2Little((unsigned char*)&var,
sizeof(var))
(on peut ne pas aimer le retour unsigned char * et le #define).
Hors bibliothèque spécifiquement orientée TCP/IP, vous êtes de toutes
façons obligé de faire des tests/hypothèses.
Ce format fichier n'a rien à voir avec les réseaux, mais sa
documentation dit que les données numériques sont stockées en "network
byte order".
OK. Le problème reste de le même.
Si vous acceptez qu'il n'existe que des machines grand-boutiennes qui
vont lire directement vos binaires, et des machines petit-boutiennes
sur la base du char, à la fois pour les flottants et les entiers, il
n'y a qu'un test et une fonction à écrire:
unsigned char * AjusteBig2Little(unsigned char * zone, size_t n)
{
unsigned char tempo;
int i = 0;
int j = n-1;
assert( zone != NULL && n > 0);
while (i < j)
{
tempo = zone[i];
zone[i] = zone[j];
zone[j] = tempo;
i++, j--;
}
return zone;
}
Cela va-t-il réellement marcher ?
Si vous utilisez une archi x86, certainement. Disons que ainsi, ça
Il m'avait semblé que pour des dword les octets étaient échangés word
par word.
je ne suis pas très clair voici un exemple tel que j'avais compris la
chose :
0xAABBCCDD en big endian donnerait 0xCCDDAABB
Ça se trouve certainement, sur des archis n'ayant pas d'accès mémoire
Ou je me trompe et il donne simplement 0xDDCCBBAA ?? (Dans ce cas
évidemment mon problème était trivial et je vous ai embêtés pour rien :)
C'est certainement le cas. Faites avec un éditeur hexa un fichier
Hors bibliothèque spécifiquement orientée TCP/IP, vous êtes de toutes
façons obligé de faire des tests/hypothèses.
Ce format fichier n'a rien à voir avec les réseaux, mais sa
documentation dit que les données numériques sont stockées en "network
byte order".
OK. Le problème reste de le même.
Si vous acceptez qu'il n'existe que des machines grand-boutiennes qui
vont lire directement vos binaires, et des machines petit-boutiennes
sur la base du char, à la fois pour les flottants et les entiers, il
n'y a qu'un test et une fonction à écrire:
unsigned char * AjusteBig2Little(unsigned char * zone, size_t n)
{
unsigned char tempo;
int i = 0;
int j = n-1;
assert( zone != NULL && n > 0);
while (i < j)
{
tempo = zone[i];
zone[i] = zone[j];
zone[j] = tempo;
i++, j--;
}
return zone;
}
Cela va-t-il réellement marcher ?
Si vous utilisez une archi x86, certainement. Disons que ainsi, ça
Il m'avait semblé que pour des dword les octets étaient échangés word
par word.
je ne suis pas très clair voici un exemple tel que j'avais compris la
chose :
0xAABBCCDD en big endian donnerait 0xCCDDAABB
Ça se trouve certainement, sur des archis n'ayant pas d'accès mémoire
Ou je me trompe et il donne simplement 0xDDCCBBAA ?? (Dans ce cas
évidemment mon problème était trivial et je vous ai embêtés pour rien :)
C'est certainement le cas. Faites avec un éditeur hexa un fichier
Hors bibliothèque spécifiquement orientée TCP/IP, vous êtes de toutes
façons obligé de faire des tests/hypothèses.
Ce format fichier n'a rien à voir avec les réseaux, mais sa
documentation dit que les données numériques sont stockées en "network
byte order".
OK. Le problème reste de le même.
Si vous acceptez qu'il n'existe que des machines grand-boutiennes qui
vont lire directement vos binaires, et des machines petit-boutiennes
sur la base du char, à la fois pour les flottants et les entiers, il
n'y a qu'un test et une fonction à écrire:
unsigned char * AjusteBig2Little(unsigned char * zone, size_t n)
{
unsigned char tempo;
int i = 0;
int j = n-1;
assert( zone != NULL && n > 0);
while (i < j)
{
tempo = zone[i];
zone[i] = zone[j];
zone[j] = tempo;
i++, j--;
}
return zone;
}
Cela va-t-il réellement marcher ?
Si vous utilisez une archi x86, certainement. Disons que ainsi, ça
Il m'avait semblé que pour des dword les octets étaient échangés word
par word.
je ne suis pas très clair voici un exemple tel que j'avais compris la
chose :
0xAABBCCDD en big endian donnerait 0xCCDDAABB
Ça se trouve certainement, sur des archis n'ayant pas d'accès mémoire
Ou je me trompe et il donne simplement 0xDDCCBBAA ?? (Dans ce cas
évidemment mon problème était trivial et je vous ai embêtés pour rien :)
C'est certainement le cas. Faites avec un éditeur hexa un fichier
Je veux lire un fichier dans un format binaire [...] en "network byte
order", c'est-à-dire big endian si j'ai bien compris.
j'ai donc pensé aux fonctions de la série htonl, nltoh etc.
[mais] elles ne permettent de traduire que des types entiers et non
des flottants.
je vais être obligé d'écrire mes propres routines de conversions.
Je veux lire un fichier dans un format binaire [...] en "network byte
order", c'est-à-dire big endian si j'ai bien compris.
j'ai donc pensé aux fonctions de la série htonl, nltoh etc.
[mais] elles ne permettent de traduire que des types entiers et non
des flottants.
je vais être obligé d'écrire mes propres routines de conversions.
Je veux lire un fichier dans un format binaire [...] en "network byte
order", c'est-à-dire big endian si j'ai bien compris.
j'ai donc pensé aux fonctions de la série htonl, nltoh etc.
[mais] elles ne permettent de traduire que des types entiers et non
des flottants.
je vais être obligé d'écrire mes propres routines de conversions.
Ce que tu veux, c'est optimiser ta routine de lecture de
flottants. Tu connais le format de ton fichier, c'est
déjà cela. Mais connais-tu l'odre (gros ou petit boutien)
des flottants sur ta machine ? Parce qu'il se trouve que
ce n'est pas forcément le même que celui auquel tout le
monde pense, celui des entiers. :-)))
Ce que tu veux, c'est optimiser ta routine de lecture de
flottants. Tu connais le format de ton fichier, c'est
déjà cela. Mais connais-tu l'odre (gros ou petit boutien)
des flottants sur ta machine ? Parce qu'il se trouve que
ce n'est pas forcément le même que celui auquel tout le
monde pense, celui des entiers. :-)))
Ce que tu veux, c'est optimiser ta routine de lecture de
flottants. Tu connais le format de ton fichier, c'est
déjà cela. Mais connais-tu l'odre (gros ou petit boutien)
des flottants sur ta machine ? Parce qu'il se trouve que
ce n'est pas forcément le même que celui auquel tout le
monde pense, celui des entiers. :-)))
bool
readDouble( double* dest, FILE* source )
{
unsigned long long result = 0 ;
int shift = 64 ;
do {
int ch = fgetc( source ) ;
if ( ch != EOF ) {
shift -= 8 ;
result |= (unsigned long long)ch << shift ;
}
} while ( ch != EOF && shift != 0 ) ;
if ( ch != EOF ) {
dest = *(double*)( &result ) ;
}
return ch != EOF ;
}
bool
readDouble( double* dest, FILE* source )
{
unsigned long long result = 0 ;
int shift = 64 ;
do {
int ch = fgetc( source ) ;
if ( ch != EOF ) {
shift -= 8 ;
result |= (unsigned long long)ch << shift ;
}
} while ( ch != EOF && shift != 0 ) ;
if ( ch != EOF ) {
dest = *(double*)( &result ) ;
}
return ch != EOF ;
}
bool
readDouble( double* dest, FILE* source )
{
unsigned long long result = 0 ;
int shift = 64 ;
do {
int ch = fgetc( source ) ;
if ( ch != EOF ) {
shift -= 8 ;
result |= (unsigned long long)ch << shift ;
}
} while ( ch != EOF && shift != 0 ) ;
if ( ch != EOF ) {
dest = *(double*)( &result ) ;
}
return ch != EOF ;
}