Je dispose d'un buffer dans lequel, à intervalles irréguliers, se
trouvent des suites 4 char correspondants à des entiers 32 bits.
Existe-t-il une fonction permettant de convertir cette sous-chaine
binaire à la valeur entière correspondante ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Emmanuel Delahaye
kato wrote on 14/05/05 :
Je dispose d'un buffer dans lequel, à intervalles irréguliers, se trouvent des suites 4 char correspondants à des entiers 32 bits. Existe-t-il une fonction permettant de convertir cette sous-chaine binaire à la valeur entière correspondante ?
Il faut les assembler selon l'endianness de ta cible dans une variable de la taille qui va bien. Les opérateurs binaires peuvent aider | << etc.
Si les données sont au format standard 'réseau' (octet de poids fort en tête), les fonctions POSIX.1 ntoh*() peuvent aider.
-- Emmanuel The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html The C-library: http://www.dinkumware.com/refxc.html
.sig under repair
kato wrote on 14/05/05 :
Je dispose d'un buffer dans lequel, à intervalles irréguliers, se
trouvent des suites 4 char correspondants à des entiers 32 bits.
Existe-t-il une fonction permettant de convertir cette sous-chaine
binaire à la valeur entière correspondante ?
Il faut les assembler selon l'endianness de ta cible dans une variable
de la taille qui va bien. Les opérateurs binaires peuvent aider | <<
etc.
Si les données sont au format standard 'réseau' (octet de poids fort en
tête), les fonctions POSIX.1 ntoh*() peuvent aider.
--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html
Je dispose d'un buffer dans lequel, à intervalles irréguliers, se trouvent des suites 4 char correspondants à des entiers 32 bits. Existe-t-il une fonction permettant de convertir cette sous-chaine binaire à la valeur entière correspondante ?
Il faut les assembler selon l'endianness de ta cible dans une variable de la taille qui va bien. Les opérateurs binaires peuvent aider | << etc.
Si les données sont au format standard 'réseau' (octet de poids fort en tête), les fonctions POSIX.1 ntoh*() peuvent aider.
-- Emmanuel The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html The C-library: http://www.dinkumware.com/refxc.html
.sig under repair
Pierre Maurette
Bonjour,
Je dispose d'un buffer dans lequel, à intervalles irréguliers, se trouvent des suites 4 char correspondants à des entiers 32 bits. Existe-t-il une fonction permettant de convertir cette sous-chaine binaire à la valeur entière correspondante ? Lue par quelqu'un qui ne connait pas le problème, votre question n'est
pas claire. J'imagine que "intervalles irréguliers" est à prendre dans le sens "position dans le buffer". La difficulté est-elle de connaître ces positions ? Dans le cas contraire, pourquoi la solution triviale suivante n'est-elle pas satisfaisante: si Buf est le buffer (un char*), si Pos la position du int (si c'est le type de "l'entier 32 bits"), l'entier est alors int i = *((int*)(Buf + Pos)); ou int i = *((int*)(&Buf[Pos])); Si ça ne fonctionne pas, la question est: d'où vient ce fichier ? Ou alors c'est tout à fait autre chose, des entiers écrits {'6','2','3','5'} pour 6235 ?
-- Pierre
Bonjour,
Je dispose d'un buffer dans lequel, à intervalles irréguliers, se
trouvent des suites 4 char correspondants à des entiers 32 bits.
Existe-t-il une fonction permettant de convertir cette sous-chaine
binaire à la valeur entière correspondante ?
Lue par quelqu'un qui ne connait pas le problème, votre question n'est
pas claire.
J'imagine que "intervalles irréguliers" est à prendre dans le sens
"position dans le buffer".
La difficulté est-elle de connaître ces positions ?
Dans le cas contraire, pourquoi la solution triviale suivante
n'est-elle pas satisfaisante: si Buf est le buffer (un char*), si Pos
la position du int (si c'est le type de "l'entier 32 bits"), l'entier
est alors
int i = *((int*)(Buf + Pos));
ou
int i = *((int*)(&Buf[Pos]));
Si ça ne fonctionne pas, la question est: d'où vient ce fichier ?
Ou alors c'est tout à fait autre chose, des entiers écrits
{'6','2','3','5'} pour 6235 ?
Je dispose d'un buffer dans lequel, à intervalles irréguliers, se trouvent des suites 4 char correspondants à des entiers 32 bits. Existe-t-il une fonction permettant de convertir cette sous-chaine binaire à la valeur entière correspondante ? Lue par quelqu'un qui ne connait pas le problème, votre question n'est
pas claire. J'imagine que "intervalles irréguliers" est à prendre dans le sens "position dans le buffer". La difficulté est-elle de connaître ces positions ? Dans le cas contraire, pourquoi la solution triviale suivante n'est-elle pas satisfaisante: si Buf est le buffer (un char*), si Pos la position du int (si c'est le type de "l'entier 32 bits"), l'entier est alors int i = *((int*)(Buf + Pos)); ou int i = *((int*)(&Buf[Pos])); Si ça ne fonctionne pas, la question est: d'où vient ce fichier ? Ou alors c'est tout à fait autre chose, des entiers écrits {'6','2','3','5'} pour 6235 ?
-- Pierre
kato
On Sun, 15 May 2005 04:08:26 +0200, "Pierre Maurette" wrote:
Je dispose d'un buffer dans lequel, à intervalles irréguliers, se trouvent des suites 4 char correspondants à des entiers 32 bits. Existe-t-il une fonction permettant de convertir cette sous-chaine binaire à la valeur entière correspondante ?
J'imagine que "intervalles irréguliers" est à prendre dans le sens "position dans le buffer".
Oui.
La difficulté est-elle de connaître ces positions ? Dans le cas contraire, pourquoi la solution triviale suivante n'est-elle pas satisfaisante: si Buf est le buffer (un char*), si Pos la position du int (si c'est le type de "l'entier 32 bits"), l'entier est alors int i = *((int*)(Buf + Pos));
Oui, ça marche avec gcc/cygwin (pour moi, ça n'était totalement trivial :^)). Toutefois je ne pense pas que ça fonctionne, avec le même fichier en entrée, sous Mac Os X. (problème d'endianess évoqué par Emmanuel)
ou int i = *((int*)(&Buf[Pos]));
Si ça ne fonctionne pas, la question est: d'où vient ce fichier ?
Ca fonctionne, et la réponse est : "amateurs de ole structured storage, bonjour!" ;)
Merci pour m'avoir éclairé sur les possibilités de cast sur les types pointeur.
kato
On Sun, 15 May 2005 04:08:26 +0200, "Pierre Maurette"
<maurettepierre@wanadoo.fr> wrote:
Je dispose d'un buffer dans lequel, à intervalles irréguliers, se
trouvent des suites 4 char correspondants à des entiers 32 bits.
Existe-t-il une fonction permettant de convertir cette sous-chaine
binaire à la valeur entière correspondante ?
J'imagine que "intervalles irréguliers" est à prendre dans le sens
"position dans le buffer".
Oui.
La difficulté est-elle de connaître ces positions ?
Dans le cas contraire, pourquoi la solution triviale suivante
n'est-elle pas satisfaisante: si Buf est le buffer (un char*), si Pos
la position du int (si c'est le type de "l'entier 32 bits"), l'entier
est alors
int i = *((int*)(Buf + Pos));
Oui, ça marche avec gcc/cygwin (pour moi, ça n'était totalement
trivial :^)). Toutefois je ne pense pas que ça fonctionne, avec le
même fichier en entrée, sous Mac Os X. (problème d'endianess évoqué
par Emmanuel)
ou
int i = *((int*)(&Buf[Pos]));
Si ça ne fonctionne pas, la question est: d'où vient ce fichier ?
Ca fonctionne, et la réponse est : "amateurs de ole structured
storage, bonjour!" ;)
Merci pour m'avoir éclairé sur les possibilités de cast sur les types
pointeur.
On Sun, 15 May 2005 04:08:26 +0200, "Pierre Maurette" wrote:
Je dispose d'un buffer dans lequel, à intervalles irréguliers, se trouvent des suites 4 char correspondants à des entiers 32 bits. Existe-t-il une fonction permettant de convertir cette sous-chaine binaire à la valeur entière correspondante ?
J'imagine que "intervalles irréguliers" est à prendre dans le sens "position dans le buffer".
Oui.
La difficulté est-elle de connaître ces positions ? Dans le cas contraire, pourquoi la solution triviale suivante n'est-elle pas satisfaisante: si Buf est le buffer (un char*), si Pos la position du int (si c'est le type de "l'entier 32 bits"), l'entier est alors int i = *((int*)(Buf + Pos));
Oui, ça marche avec gcc/cygwin (pour moi, ça n'était totalement trivial :^)). Toutefois je ne pense pas que ça fonctionne, avec le même fichier en entrée, sous Mac Os X. (problème d'endianess évoqué par Emmanuel)
ou int i = *((int*)(&Buf[Pos]));
Si ça ne fonctionne pas, la question est: d'où vient ce fichier ?
Ca fonctionne, et la réponse est : "amateurs de ole structured storage, bonjour!" ;)
Merci pour m'avoir éclairé sur les possibilités de cast sur les types pointeur.
kato
Pierre Maurette
[...]
Ca fonctionne, et la réponse est : "amateurs de ole structured storage, bonjour!" ;) Connais pas de façon intime, ni même superficielle. Concernant
l'endianess, la conversion quand on connait exactement les données du problème, c'est de la simple tuyauterie. En revanche, la détection peut être un problème. Il faut donc en savoir plus sur ce format OSS. - Est-ce un format unique, comme les images ou la musique par exemple ? A ce moment-là, le problème n'est pas énorme. On sait vers quelle plateforme on compile (on peut même le tester si on compile sur la plateforme cible, ce qui est fréquent), on insèrera conditionnellement les conversions. A ce moment-là, c'est sur les big-endian (Apple) qu'il faudra convertir, puisque vous dites que la lecture directe fonctionne sous Windows. De plus, OSS est Microsoft, il me semble. - Le format dépend-il de la plateforme, sans échange brutal de fichiers envisagés ? Alors, le code C proposé suffit dans tous les cas. - Le frormat dépend-il de la plateforme, et des échanges bruts sont à attendre ? Alors se posera peut-être le problème de la détection automatique ...
-- Pierre
[...]
Ca fonctionne, et la réponse est : "amateurs de ole structured
storage, bonjour!" ;)
Connais pas de façon intime, ni même superficielle. Concernant
l'endianess, la conversion quand on connait exactement les données du
problème, c'est de la simple tuyauterie. En revanche, la détection peut
être un problème. Il faut donc en savoir plus sur ce format OSS.
- Est-ce un format unique, comme les images ou la musique par exemple ?
A ce moment-là, le problème n'est pas énorme. On sait vers quelle
plateforme on compile (on peut même le tester si on compile sur la
plateforme cible, ce qui est fréquent), on insèrera conditionnellement
les conversions. A ce moment-là, c'est sur les big-endian (Apple) qu'il
faudra convertir, puisque vous dites que la lecture directe fonctionne
sous Windows. De plus, OSS est Microsoft, il me semble.
- Le format dépend-il de la plateforme, sans échange brutal de fichiers
envisagés ? Alors, le code C proposé suffit dans tous les cas.
- Le frormat dépend-il de la plateforme, et des échanges bruts sont à
attendre ? Alors se posera peut-être le problème de la détection
automatique ...
Ca fonctionne, et la réponse est : "amateurs de ole structured storage, bonjour!" ;) Connais pas de façon intime, ni même superficielle. Concernant
l'endianess, la conversion quand on connait exactement les données du problème, c'est de la simple tuyauterie. En revanche, la détection peut être un problème. Il faut donc en savoir plus sur ce format OSS. - Est-ce un format unique, comme les images ou la musique par exemple ? A ce moment-là, le problème n'est pas énorme. On sait vers quelle plateforme on compile (on peut même le tester si on compile sur la plateforme cible, ce qui est fréquent), on insèrera conditionnellement les conversions. A ce moment-là, c'est sur les big-endian (Apple) qu'il faudra convertir, puisque vous dites que la lecture directe fonctionne sous Windows. De plus, OSS est Microsoft, il me semble. - Le format dépend-il de la plateforme, sans échange brutal de fichiers envisagés ? Alors, le code C proposé suffit dans tous les cas. - Le frormat dépend-il de la plateforme, et des échanges bruts sont à attendre ? Alors se posera peut-être le problème de la détection automatique ...
-- Pierre
kato
On Sun, 15 May 2005 11:17:59 +0200, "Pierre Maurette" wrote:
Ca fonctionne, et la réponse est : "amateurs de ole structured storage, bonjour!" ;) [...]
- Est-ce un format unique, comme les images ou la musique par exemple ? En fait, c'est un format "container" pour des documents "composés". Il
est conçu comme un système de fichiers avec ses propres FAT, tables d'indirection (MiniFAT) arborescences internes, et contient d'autres fichiers (textes, graphiques, etc ...)
A ce moment-là, le problème n'est pas énorme. On sait vers quelle plateforme on compile (on peut même le tester si on compile sur la plateforme cible, ce qui est fréquent), on insèrera conditionnellement les conversions. A ce moment-là, c'est sur les big-endian (Apple) qu'il faudra convertir, puisque vous dites que la lecture directe fonctionne sous Windows. Je me suis peut-être avancé un peu vite. Je n'ai pour l'instant testé
que des conversions d'entiers résidants avec bon goût sur des frontières de mots de 32 bits. Je vais aussi avoir à traiter des timestamps windows (64 bits) alignés de façon pseudo-aléatoire sur des frontières de mots de 16 bits.
De plus, OSS est Microsoft, il me semble. C'est effectivement du format microsoft a priori conçu pour être
utilisé par des applis windows. Toutefois, l'outil que j'écris est destiné à être utilisé sur des stations tournant le plus souvent sous linux ou MacOSX.
kato
On Sun, 15 May 2005 11:17:59 +0200, "Pierre Maurette"
<maurettepierre@wanadoo.fr> wrote:
Ca fonctionne, et la réponse est : "amateurs de ole structured
storage, bonjour!" ;)
[...]
- Est-ce un format unique, comme les images ou la musique par exemple ?
En fait, c'est un format "container" pour des documents "composés". Il
est conçu comme un système de fichiers avec ses propres FAT, tables
d'indirection (MiniFAT) arborescences internes, et contient d'autres
fichiers (textes, graphiques, etc ...)
A ce moment-là, le problème n'est pas énorme. On sait vers quelle
plateforme on compile (on peut même le tester si on compile sur la
plateforme cible, ce qui est fréquent), on insèrera conditionnellement
les conversions. A ce moment-là, c'est sur les big-endian (Apple) qu'il
faudra convertir, puisque vous dites que la lecture directe fonctionne
sous Windows.
Je me suis peut-être avancé un peu vite. Je n'ai pour l'instant testé
que des conversions d'entiers résidants avec bon goût sur des
frontières de mots de 32 bits. Je vais aussi avoir à traiter des
timestamps windows (64 bits) alignés de façon pseudo-aléatoire sur des
frontières de mots de 16 bits.
De plus, OSS est Microsoft, il me semble.
C'est effectivement du format microsoft a priori conçu pour être
utilisé par des applis windows. Toutefois, l'outil que j'écris est
destiné à être utilisé sur des stations tournant le plus souvent sous
linux ou MacOSX.
On Sun, 15 May 2005 11:17:59 +0200, "Pierre Maurette" wrote:
Ca fonctionne, et la réponse est : "amateurs de ole structured storage, bonjour!" ;) [...]
- Est-ce un format unique, comme les images ou la musique par exemple ? En fait, c'est un format "container" pour des documents "composés". Il
est conçu comme un système de fichiers avec ses propres FAT, tables d'indirection (MiniFAT) arborescences internes, et contient d'autres fichiers (textes, graphiques, etc ...)
A ce moment-là, le problème n'est pas énorme. On sait vers quelle plateforme on compile (on peut même le tester si on compile sur la plateforme cible, ce qui est fréquent), on insèrera conditionnellement les conversions. A ce moment-là, c'est sur les big-endian (Apple) qu'il faudra convertir, puisque vous dites que la lecture directe fonctionne sous Windows. Je me suis peut-être avancé un peu vite. Je n'ai pour l'instant testé
que des conversions d'entiers résidants avec bon goût sur des frontières de mots de 32 bits. Je vais aussi avoir à traiter des timestamps windows (64 bits) alignés de façon pseudo-aléatoire sur des frontières de mots de 16 bits.
De plus, OSS est Microsoft, il me semble. C'est effectivement du format microsoft a priori conçu pour être
utilisé par des applis windows. Toutefois, l'outil que j'écris est destiné à être utilisé sur des stations tournant le plus souvent sous linux ou MacOSX.