OVH Cloud OVH Cloud

Travailler avec des bytes en C

3 réponses
Avatar
simon.bree
Bonjour,

J'ai un buffer de bytes en C.

J'ai trouver sous java que pour transformer un byte en entier on=20
utilise :
(buffer[0] & 0xff) | ((buffer[1] & 0xff) << 8) | ((buffer[2] & 0xff)=20
<< 16) | (buffer[3] << 24)

Est-ce la m=EAme chose en C? Et si oui, pourriez-vous m'expliquer cette=20
syntaxe?

Merci d'avance,
Simon

3 réponses

Avatar
Eric Levenez
Le 27/01/07 12:46, dans
,
«  » a écrit :

J'ai un buffer de bytes en C.


En C un byte est un char et peut faire de 1 à N octets de long. Typiquement
un byte vaut 1 octet, mais cela n'est pas général.

J'ai trouver sous java que pour transformer un byte en entier on
utilise :
(buffer[0] & 0xff) | ((buffer[1] & 0xff) << 8) | ((buffer[2] & 0xff)
<< 16) | (buffer[3] << 24)

Est-ce la même chose en C?


Si buffer est un tableau de 4 entiers en Little Endian, alors la formule
ci-dessus reconstruira un entier 32 bits.

Et si oui, pourriez-vous m'expliquer cette
syntaxe?


(nb & 0xff) sert à masquer les 8 bits de poids faible d'en entier.

(nb << 8) décale à gauche les bits d'un entier (donc multiplication par
256).

(a | b) est un "ou" logique entre 2 entiers. Dans le cas présent, le | est
comme un + car on mélange des bouts d'octets pour construire un grand
nombre.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
Vincent Lefevre
Dans l'article <C1E0FD52.9C618%,
Eric Levenez écrit:

Le 27/01/07 12:46, dans
,
«  » a écrit :

J'ai un buffer de bytes en C.


En C un byte est un char et peut faire de 1 à N octets de long.


Et pas forcément un nombre entier d'octets, d'ailleurs.

J'ai trouver sous java que pour transformer un byte en entier on
utilise :
(buffer[0] & 0xff) | ((buffer[1] & 0xff) << 8) | ((buffer[2] & 0xff)
<< 16) | (buffer[3] << 24)

Est-ce la même chose en C?


Si buffer est un tableau de 4 entiers en Little Endian, alors la formule
ci-dessus reconstruira un entier 32 bits.


À condition qu'il soit positif. Sinon c'est un comportement indéfini.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


Avatar
Antoine Leca
Vincent Lefevre écrivit dans
news:20070128023142$:
Dans l'article <C1E0FD52.9C618%,
Eric Levenez écrit:

(buffer[0] & 0xff) | ((buffer[1] & 0xff) << 8) | ((buffer[2] & 0xff)
<< 16) | (buffer[3] << 24)


Si buffer est un tableau de 4 entiers en Little Endian, alors la
formule ci-dessus reconstruira un entier 32 bits.


À condition qu'il soit positif. Sinon c'est un comportement indéfini.


Mmmm. En fait, cela dépend beaucoup du type de *buffer (et de
l'architecture), et beaucoup moins du signe de l'entier résultant.


Antoine