Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

convertir une suite de char's en int

5 réponses
Avatar
kato
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 ?

D'avance merci pour vos réponses

kato

5 réponses

Avatar
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

Avatar
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

Avatar
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


Avatar
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

Avatar
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