uchar tmp[ 4 ] ;
if (!source.read(reinterpret_cast<char*>(tmp),4))
throw Exception("Impossible de lire le fichier");
float * f = (float *)tmp;
Est-ce que la conversion et l'extraction des bits est
différente selon qu'on soit sur des représentations intel, MIPS ou DEC?
Ensuite je dois extraire les bits de poids fort et faible et récupérer
ces deux valeurs...
uchar tmp[ 4 ] ;
if (!source.read(reinterpret_cast<char*>(tmp),4))
throw Exception("Impossible de lire le fichier");
float * f = (float *)tmp;
Est-ce que la conversion et l'extraction des bits est
différente selon qu'on soit sur des représentations intel, MIPS ou DEC?
Ensuite je dois extraire les bits de poids fort et faible et récupérer
ces deux valeurs...
uchar tmp[ 4 ] ;
if (!source.read(reinterpret_cast<char*>(tmp),4))
throw Exception("Impossible de lire le fichier");
float * f = (float *)tmp;
Est-ce que la conversion et l'extraction des bits est
différente selon qu'on soit sur des représentations intel, MIPS ou DEC?
Ensuite je dois extraire les bits de poids fort et faible et récupérer
ces deux valeurs...
static size_t const TAILLE_BUF= sizeof (float);
char buf[TAILLE_BUF];
source.read (buf, TAILLE_BUF); // + contrôle d'erreur
float reponse= *reinterpret_cast<float const*> (buf);
static size_t const TAILLE_BUF= sizeof (float);
char buf[TAILLE_BUF];
source.read (buf, TAILLE_BUF); // + contrôle d'erreur
float reponse= *reinterpret_cast<float const*> (buf);
static size_t const TAILLE_BUF= sizeof (float);
char buf[TAILLE_BUF];
source.read (buf, TAILLE_BUF); // + contrôle d'erreur
float reponse= *reinterpret_cast<float const*> (buf);
J'ai osé écrire :static size_t const TAILLE_BUF= sizeof (float);
char buf[TAILLE_BUF];
source.read (buf, TAILLE_BUF); // + contrôle d'erreur
float reponse= *reinterpret_cast<float const*> (buf);
Bien sûr, ce code ne peut fonctionner que si le fichier binaire a été
créé avec un code analogue, compilé avec le même compilo (ou un
compilo compatible).
J'ai osé écrire :
static size_t const TAILLE_BUF= sizeof (float);
char buf[TAILLE_BUF];
source.read (buf, TAILLE_BUF); // + contrôle d'erreur
float reponse= *reinterpret_cast<float const*> (buf);
Bien sûr, ce code ne peut fonctionner que si le fichier binaire a été
créé avec un code analogue, compilé avec le même compilo (ou un
compilo compatible).
J'ai osé écrire :static size_t const TAILLE_BUF= sizeof (float);
char buf[TAILLE_BUF];
source.read (buf, TAILLE_BUF); // + contrôle d'erreur
float reponse= *reinterpret_cast<float const*> (buf);
Bien sûr, ce code ne peut fonctionner que si le fichier binaire a été
créé avec un code analogue, compilé avec le même compilo (ou un
compilo compatible).
On 22 Mar 2006 22:32:43 GMT, Michael
:uchar tmp[ 4 ] ;
Pourquoi uchar ?if (!source.read(reinterpret_cast<char*>(tmp),4))
throw Exception("Impossible de lire le fichier");
float * f = (float *)tmp;
Et pourquoi un cast à la C ici ?
Si tu veux lire un nombre dans un fichier de façon aussi brute que ça,
void* pourrait être pas mal. Ou bien char*, puisque c'est le type
attendu par istream::read.
static size_t const TAILLE_BUF= sizeof (float);
char buf[TAILLE_BUF];
source.read (buf, TAILLE_BUF); // + contrôle d'erreur
float reponse= *reinterpret_cast<float const*> (buf);
On 22 Mar 2006 22:32:43 GMT, Michael
<michael_delva.enlever@hotmail.com>:
uchar tmp[ 4 ] ;
Pourquoi uchar ?
if (!source.read(reinterpret_cast<char*>(tmp),4))
throw Exception("Impossible de lire le fichier");
float * f = (float *)tmp;
Et pourquoi un cast à la C ici ?
Si tu veux lire un nombre dans un fichier de façon aussi brute que ça,
void* pourrait être pas mal. Ou bien char*, puisque c'est le type
attendu par istream::read.
static size_t const TAILLE_BUF= sizeof (float);
char buf[TAILLE_BUF];
source.read (buf, TAILLE_BUF); // + contrôle d'erreur
float reponse= *reinterpret_cast<float const*> (buf);
On 22 Mar 2006 22:32:43 GMT, Michael
:uchar tmp[ 4 ] ;
Pourquoi uchar ?if (!source.read(reinterpret_cast<char*>(tmp),4))
throw Exception("Impossible de lire le fichier");
float * f = (float *)tmp;
Et pourquoi un cast à la C ici ?
Si tu veux lire un nombre dans un fichier de façon aussi brute que ça,
void* pourrait être pas mal. Ou bien char*, puisque c'est le type
attendu par istream::read.
static size_t const TAILLE_BUF= sizeof (float);
char buf[TAILLE_BUF];
source.read (buf, TAILLE_BUF); // + contrôle d'erreur
float reponse= *reinterpret_cast<float const*> (buf);
voilà ce que je n'arrive pas à faire:
je dois extraire un flottant codé sur 4 octets depuis un
fichier binaire,
que je dois convertir en entier non signé.
Ensuite je dois extraire les bits de poids fort et faible et
récupérer ces deux valeurs...
Récupérer le flottant, j'y arrive:
float IntelDataHandler::readFloat(std::ifstream & source ) const
{
uchar tmp[ 4 ] ;
if (!source.read(reinterpret_cast<char*>(tmp),4))
throw Exception("Impossible de lire le fichier");
float * f = (float *)tmp;
float flt = *f;
return flt;
}
Mais pour le reste? Est-ce que la conversion et l'extraction
des bits est différente selon qu'on soit sur des
représentations intel, MIPS ou DEC?
Et comment je peux extraire les deux données?
Est-ce que je ne peux tout simplement pas, au lieu de lire un
float, lire deux short, me donnant directement les bonnes
valeurs?
short IntelDataHandler::readShort(std::ifstream & source ) const
{
uchar tmp[ 2 ] ;
if (!source.read(reinterpret_cast<char*>(tmp),2))
throw Exception("Impossible de lire le fichier");
return (tmp[ 1 ] << 8) | tmp[ 0 ] ;
}
voilà ce que je n'arrive pas à faire:
je dois extraire un flottant codé sur 4 octets depuis un
fichier binaire,
que je dois convertir en entier non signé.
Ensuite je dois extraire les bits de poids fort et faible et
récupérer ces deux valeurs...
Récupérer le flottant, j'y arrive:
float IntelDataHandler::readFloat(std::ifstream & source ) const
{
uchar tmp[ 4 ] ;
if (!source.read(reinterpret_cast<char*>(tmp),4))
throw Exception("Impossible de lire le fichier");
float * f = (float *)tmp;
float flt = *f;
return flt;
}
Mais pour le reste? Est-ce que la conversion et l'extraction
des bits est différente selon qu'on soit sur des
représentations intel, MIPS ou DEC?
Et comment je peux extraire les deux données?
Est-ce que je ne peux tout simplement pas, au lieu de lire un
float, lire deux short, me donnant directement les bonnes
valeurs?
short IntelDataHandler::readShort(std::ifstream & source ) const
{
uchar tmp[ 2 ] ;
if (!source.read(reinterpret_cast<char*>(tmp),2))
throw Exception("Impossible de lire le fichier");
return (tmp[ 1 ] << 8) | tmp[ 0 ] ;
}
voilà ce que je n'arrive pas à faire:
je dois extraire un flottant codé sur 4 octets depuis un
fichier binaire,
que je dois convertir en entier non signé.
Ensuite je dois extraire les bits de poids fort et faible et
récupérer ces deux valeurs...
Récupérer le flottant, j'y arrive:
float IntelDataHandler::readFloat(std::ifstream & source ) const
{
uchar tmp[ 4 ] ;
if (!source.read(reinterpret_cast<char*>(tmp),4))
throw Exception("Impossible de lire le fichier");
float * f = (float *)tmp;
float flt = *f;
return flt;
}
Mais pour le reste? Est-ce que la conversion et l'extraction
des bits est différente selon qu'on soit sur des
représentations intel, MIPS ou DEC?
Et comment je peux extraire les deux données?
Est-ce que je ne peux tout simplement pas, au lieu de lire un
float, lire deux short, me donnant directement les bonnes
valeurs?
short IntelDataHandler::readShort(std::ifstream & source ) const
{
uchar tmp[ 2 ] ;
if (!source.read(reinterpret_cast<char*>(tmp),2))
throw Exception("Impossible de lire le fichier");
return (tmp[ 1 ] << 8) | tmp[ 0 ] ;
}
On 22 Mar 2006 22:32:43 GMT, Michael
:uchar tmp[ 4 ] ;
Pourquoi uchar ?
if (!source.read(reinterpret_cast<char*>(tmp),4))
throw Exception("Impossible de lire le fichier");
float * f = (float *)tmp;
Et pourquoi un cast à la C ici ?
Si tu veux lire un nombre dans un fichier de façon aussi brute
que ça, void* pourrait être pas mal.
Ou bien char*, puisque
c'est le type attendu par istream::read.
static size_t const TAILLE_BUF= sizeof (float);
char buf[TAILLE_BUF];
source.read (buf, TAILLE_BUF); // + contrôle d'erreur
float reponse= *reinterpret_cast<float const*> (buf);
return reponse;Est-ce que la conversion et l'extraction des bits est
différente selon qu'on soit sur des représentations intel,
MIPS ou DEC?
C'est surtout la représentation d'un float en mémoire qui
risque d'être différente...
De toutes façons, si tu lis des nombres depuis un fichier de
cette façon, c'est fortement dépendant de la plate-forme.
On 22 Mar 2006 22:32:43 GMT, Michael
<michael_delva.enlever@hotmail.com>:
uchar tmp[ 4 ] ;
Pourquoi uchar ?
if (!source.read(reinterpret_cast<char*>(tmp),4))
throw Exception("Impossible de lire le fichier");
float * f = (float *)tmp;
Et pourquoi un cast à la C ici ?
Si tu veux lire un nombre dans un fichier de façon aussi brute
que ça, void* pourrait être pas mal.
Ou bien char*, puisque
c'est le type attendu par istream::read.
static size_t const TAILLE_BUF= sizeof (float);
char buf[TAILLE_BUF];
source.read (buf, TAILLE_BUF); // + contrôle d'erreur
float reponse= *reinterpret_cast<float const*> (buf);
return reponse;
Est-ce que la conversion et l'extraction des bits est
différente selon qu'on soit sur des représentations intel,
MIPS ou DEC?
C'est surtout la représentation d'un float en mémoire qui
risque d'être différente...
De toutes façons, si tu lis des nombres depuis un fichier de
cette façon, c'est fortement dépendant de la plate-forme.
On 22 Mar 2006 22:32:43 GMT, Michael
:uchar tmp[ 4 ] ;
Pourquoi uchar ?
if (!source.read(reinterpret_cast<char*>(tmp),4))
throw Exception("Impossible de lire le fichier");
float * f = (float *)tmp;
Et pourquoi un cast à la C ici ?
Si tu veux lire un nombre dans un fichier de façon aussi brute
que ça, void* pourrait être pas mal.
Ou bien char*, puisque
c'est le type attendu par istream::read.
static size_t const TAILLE_BUF= sizeof (float);
char buf[TAILLE_BUF];
source.read (buf, TAILLE_BUF); // + contrôle d'erreur
float reponse= *reinterpret_cast<float const*> (buf);
return reponse;Est-ce que la conversion et l'extraction des bits est
différente selon qu'on soit sur des représentations intel,
MIPS ou DEC?
C'est surtout la représentation d'un float en mémoire qui
risque d'être différente...
De toutes façons, si tu lis des nombres depuis un fichier de
cette façon, c'est fortement dépendant de la plate-forme.
Mais il me semble qu'on avait traité ce thème dans un fil il y a
peu de temps.
Mais il me semble qu'on avait traité ce thème dans un fil il y a
peu de temps.
Mais il me semble qu'on avait traité ce thème dans un fil il y a
peu de temps.
je dois extraire un flottant codé sur 4 octets depuis un
fichier binaire,
En quel format ? XDR ?
que je dois convertir en entier non signé.
Avec quelles règles d'arrondi ? Où est-ce qu'on sait qu'a
priori, le flottant représente un entier dans l'intervale
représentable dans le type cible (int, long ?) ?
Ensuite je dois extraire les bits de poids fort et faible et
récupérer ces deux valeurs...
Je ne suis pas sur ce que tu veux dire par là. A priori, si tu
as un int32_t, « ((uint32_t)(-1) << (32 - n)) & valeur »
récupère les n bits de poids forts. Alternativement, on pourrait
vouloir les avoir comme valeur, avec simplement « valeur >> (32
- n) » (mais attention au comportement en cas de valeur
négative).Récupérer le flottant, j'y arrive:
float IntelDataHandler::readFloat(std::ifstream & source ) const
{
uchar tmp[ 4 ] ;
if (!source.read(reinterpret_cast<char*>(tmp),4))
throw Exception("Impossible de lire le fichier");
float * f = (float *)tmp;
float flt = *f;
return flt;
}
Ça ne marche que si le flottant a été écrit par un programme
compilé avec la même version du même compilateur, compilé avec
les mêmes options, pour la même architecture. Et encore... rien
ne garantit que tmp soit correctement aligné pour contenir un
float.
Et comment je peux extraire les deux données?
Est-ce que je ne peux tout simplement pas, au lieu de lire un
float, lire deux short, me donnant directement les bonnes
valeurs?
Certainement pas.
short IntelDataHandler::readShort(std::ifstream & source ) const
{
uchar tmp[ 2 ] ;
if (!source.read(reinterpret_cast<char*>(tmp),2))
throw Exception("Impossible de lire le fichier");
return (tmp[ 1 ] << 8) | tmp[ 0 ] ;
}
Ce qui suppose des shorts en format Intel, et non XDR.
je dois extraire un flottant codé sur 4 octets depuis un
fichier binaire,
En quel format ? XDR ?
que je dois convertir en entier non signé.
Avec quelles règles d'arrondi ? Où est-ce qu'on sait qu'a
priori, le flottant représente un entier dans l'intervale
représentable dans le type cible (int, long ?) ?
Ensuite je dois extraire les bits de poids fort et faible et
récupérer ces deux valeurs...
Je ne suis pas sur ce que tu veux dire par là. A priori, si tu
as un int32_t, « ((uint32_t)(-1) << (32 - n)) & valeur »
récupère les n bits de poids forts. Alternativement, on pourrait
vouloir les avoir comme valeur, avec simplement « valeur >> (32
- n) » (mais attention au comportement en cas de valeur
négative).
Récupérer le flottant, j'y arrive:
float IntelDataHandler::readFloat(std::ifstream & source ) const
{
uchar tmp[ 4 ] ;
if (!source.read(reinterpret_cast<char*>(tmp),4))
throw Exception("Impossible de lire le fichier");
float * f = (float *)tmp;
float flt = *f;
return flt;
}
Ça ne marche que si le flottant a été écrit par un programme
compilé avec la même version du même compilateur, compilé avec
les mêmes options, pour la même architecture. Et encore... rien
ne garantit que tmp soit correctement aligné pour contenir un
float.
Et comment je peux extraire les deux données?
Est-ce que je ne peux tout simplement pas, au lieu de lire un
float, lire deux short, me donnant directement les bonnes
valeurs?
Certainement pas.
short IntelDataHandler::readShort(std::ifstream & source ) const
{
uchar tmp[ 2 ] ;
if (!source.read(reinterpret_cast<char*>(tmp),2))
throw Exception("Impossible de lire le fichier");
return (tmp[ 1 ] << 8) | tmp[ 0 ] ;
}
Ce qui suppose des shorts en format Intel, et non XDR.
je dois extraire un flottant codé sur 4 octets depuis un
fichier binaire,
En quel format ? XDR ?
que je dois convertir en entier non signé.
Avec quelles règles d'arrondi ? Où est-ce qu'on sait qu'a
priori, le flottant représente un entier dans l'intervale
représentable dans le type cible (int, long ?) ?
Ensuite je dois extraire les bits de poids fort et faible et
récupérer ces deux valeurs...
Je ne suis pas sur ce que tu veux dire par là. A priori, si tu
as un int32_t, « ((uint32_t)(-1) << (32 - n)) & valeur »
récupère les n bits de poids forts. Alternativement, on pourrait
vouloir les avoir comme valeur, avec simplement « valeur >> (32
- n) » (mais attention au comportement en cas de valeur
négative).Récupérer le flottant, j'y arrive:
float IntelDataHandler::readFloat(std::ifstream & source ) const
{
uchar tmp[ 4 ] ;
if (!source.read(reinterpret_cast<char*>(tmp),4))
throw Exception("Impossible de lire le fichier");
float * f = (float *)tmp;
float flt = *f;
return flt;
}
Ça ne marche que si le flottant a été écrit par un programme
compilé avec la même version du même compilateur, compilé avec
les mêmes options, pour la même architecture. Et encore... rien
ne garantit que tmp soit correctement aligné pour contenir un
float.
Et comment je peux extraire les deux données?
Est-ce que je ne peux tout simplement pas, au lieu de lire un
float, lire deux short, me donnant directement les bonnes
valeurs?
Certainement pas.
short IntelDataHandler::readShort(std::ifstream & source ) const
{
uchar tmp[ 2 ] ;
if (!source.read(reinterpret_cast<char*>(tmp),2))
throw Exception("Impossible de lire le fichier");
return (tmp[ 1 ] << 8) | tmp[ 0 ] ;
}
Ce qui suppose des shorts en format Intel, et non XDR.