OVH Cloud OVH Cloud

htons, ntohs etc etc

3 réponses
Avatar
Zouplaz
Bonjour, j'ai tenté de re-écrire moi même htons, htonl, ntohs ntohl mais je
ne suis pas sûr de ce que j'ai fait.

Je code sur un système 8 bits

Pourriez-vous me dire si vous voyez quelque chose d'anormal dans les 4
fonctions ci-dessous ?

Merci


u8 -> unsigned char
u16 -> unsigned int
u32 -> unsigned long

u16 ntohs(u16 netint)
{
u8 lo;
u8 hi;

lo = netint & 0x00FF;
hi = (netint & 0xFF00) >> 8;

return (lo << 8) + hi;
}

u16 htons(u16 hostint)
{
return ((hostint & 0xFF) << 8) | ((hostint & 0xFF00) >> 8);
}

u32 ntohl(u32 netlong)
{
return ((netlong & 0x0000FFFF) << 16) | ((netlong & 0xFFFF0000) >>
16);
}

u32 htonl(u32 hostlong)
{
return ((hostlong & 0x0000FFFF) << 16) | ((hostlong & 0xFFFF0000) >>
16);
}

3 réponses

Avatar
Zouplaz
Pardon, j'ai oublié de préciser que je suis sur un système little endian :

la valeur 16 bits 0xFF00 sera écrite 00 FF en mémoire...
Avatar
Jean-Marc Bourguet
Zouplaz writes:

Bonjour, j'ai tenté de re-écrire moi même htons, htonl, ntohs ntohl mais je
ne suis pas sûr de ce que j'ai fait.

Je code sur un système 8 bits

Pourriez-vous me dire si vous voyez quelque chose d'anormal dans les
4 fonctions ci-dessous ?


Oui, htons et ntohs font la meme chose (c'est normal) et ce qu'elle
font ne depend pas de la maniere dont sont stockes les short sur
l'hote (ce n'est pas normal). De plus tes long travaillent sur des
short et non sur des octets.

Bien que les deux fonctions fassent la meme chose, il y a deux maniere
de l'ecrire suivant le point de vue que l'on prend:

u16 ntohs(u16 netint)
{
u8 const* netAsByteArray const = (u8 const*) &netint;
return netAsByteArray[0]*256 + netAsByteArray[1];
}

u16 htons(u16 hostint)
{
u16 netint;
u8* netAsByteArray const = (u8 const*) &netint;
netAsByteArray[0] = (hostint & 0xFF00) >> 8;
netAsByteArray[1] = (hostint & 0xFF);
return netint;
}

Meme chose pour les long.

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Emmanuel Delahaye
Zouplaz wrote on 15/10/04 :
Bonjour, j'ai tenté de re-écrire moi même htons, htonl, ntohs ntohl mais je
ne suis pas sûr de ce que j'ai fait.

Je code sur un système 8 bits

Pourriez-vous me dire si vous voyez quelque chose d'anormal dans les 4
fonctions ci-dessous ?


Ca dépend de l'architecture (endianness).

Ceci peut t'intéresser:

http://mapage.noos.fr/emdel/clib.htm
Module HTON

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"