htons()
は、ホストバイトオーダーをネットワークバイトオーダーに変換します。Big Endianシステムでhtons()は何をしますか?
ネットワークバイトオーダーはビッグエンディアンで、ホストバイトオーダーはリトルエンディアンまたはビッグエンディアンのいずれかです。
リトルエンディアンシステムでhtons()
は、マルチバイト変数の順序をビッグエンディアンに変換します。 htons()
の場合、ホストのバイトオーダーもBig-Endianの場合はどうなりますか?
htons()
は、ホストバイトオーダーをネットワークバイトオーダーに変換します。Big Endianシステムでhtons()は何をしますか?
ネットワークバイトオーダーはビッグエンディアンで、ホストバイトオーダーはリトルエンディアンまたはビッグエンディアンのいずれかです。
リトルエンディアンシステムでhtons()
は、マルチバイト変数の順序をビッグエンディアンに変換します。 htons()
の場合、ホストのバイトオーダーもBig-Endianの場合はどうなりますか?
htons()
の場合、ホストバイトオーダーもビッグエンディアンの場合はどうなりますか?
Nothing - 全く文字通り。最初にhtons()
を導入する目的は、システムのエンディアンを気にしないコードを書くことです。関数が定義されているヘッダーファイルは、エンディアンが演奏される唯一の場所です。ここで
は、そのパラメータの表現の周りに括弧でhtons
を置き換えることone implementationです:
#if BYTE_ORDER == BIG_ENDIAN
#define HTONS(n) (n)
#define NTOHS(n) (n)
#define HTONL(n) (n)
#define NTOHL(n) (n)
#else
#define HTONS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8))
#define NTOHS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8))
#define HTONL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
((((unsigned long)(n) & 0xFF00)) << 8) | \
((((unsigned long)(n) & 0xFF0000)) >> 8) | \
((((unsigned long)(n) & 0xFF000000)) >> 24))
#define NTOHL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
((((unsigned long)(n) & 0xFF00)) << 8) | \
((((unsigned long)(n) & 0xFF0000)) >> 8) | \
((((unsigned long)(n) & 0xFF000000)) >> 24))
#endif
#define htons(n) HTONS(n)
#define ntohs(n) NTOHS(n)
#define htonl(n) HTONL(n)
#define ntohl(n) NTOHL(n)
は「ビッグエンディアン」と定義された「ネットワークオーダー」のエンディアンではないか、ということですんネットワークに依存しますか?ネットワークに依存していたのではないかと疑われますが、LinuxはTCP/IPネットワークのバイトオーダーを考慮しています。これはビッグエンディアンです。 – chux
それはNOOPある - 何も –