名 前
htobe16, htole16, be16toh, le16toh, htobe32, htole32, be32toh, le32toh, htobe64, htole64, be64toh, le64toh − ホ ス ト バ イ ト オ ー ダ ー と ビ ッ グ /リ ト ル エ ン デ ィ ア ン バ イ ト オ ー ダ ー の 間 で 値 の 変 換 を 行 う
書 式
#define
_BSD_SOURCE /* feature_test_macros(7) 参 照
*/
#include <endian.h>
uint16_t
htobe16(uint16_t host_16bits);
uint16_t htole16(uint16_t host_16bits);
uint16_t be16toh(uint16_t big_endian_16bits);
uint16_t le16toh(uint16_t
little_endian_16bits);
uint32_t
htobe32(uint32_t host_32bits);
uint32_t htole32(uint32_t host_32bits);
uint32_t be32toh(uint32_t big_endian_32bits);
uint32_t le32toh(uint32_t
little_endian_32bits);
uint64_t
htobe64(uint64_t host_64bits);
uint64_t htole64(uint64_t host_64bits);
uint64_t be64toh(uint64_t big_endian_64bits);
uint64_t le64toh(uint64_t
little_endian_64bits);
説 明
こ れ ら の 関 数 は 、 整 数 値 の バ イ ト エ ン コ ー デ ィ ン グ を 、 使 用 中 の CPU ("ホ ス ト ") の バ イ ト オ ー ダ ー か ら リ ト ル エ ン デ ィ ア ン や ビ ッ グ エ ン デ ィ ア ン バ イ ト オ ー ダ ー へ の 変 換 や そ の 逆 の 変 換 を 行 う 。 各 関 数 の 名 前 に 付 い て い る 数 字 nn は 、 そ の 関 数 が 扱 う 整 数 の サ イ ズ (16, 32, 64 ビ ッ ト の ど れ か ) を 示 し て い る 。 名 前 が "htobenn" と い う 形 の 関 数 は 、 ホ ス ト バ イ ト オ ー ダ ー か ら ビ ッ グ エ ン デ ィ ア ン バ イ ト オ ー ダ ー へ の 変 換 を 行 う 。 名 前 が "htolenn" と い う 形 の 関 数 は 、 ホ ス ト バ イ ト オ ー ダ ー か ら リ ト ル エ ン デ ィ ア ン バ イ ト オ ー ダ ー へ の 変 換 を 行 う 。 名 前 が "benntoh" と い う 形 の 関 数 は 、 ビ ッ グ エ ン デ ィ ア ン バ イ ト オ ー ダ ー か ら ホ ス ト バ イ ト オ ー ダ ー へ の 変 換 を 行 う 。 名 前 が "lenntoh" と い う 形 の 関 数 は 、 リ ト ル エ ン デ ィ ア ン バ イ ト オ ー ダ ー か ら ホ ス ト バ イ ト オ ー ダ ー へ の 変 換 を 行 う 。
バ ー ジ ョ ン
こ れ ら の 関 数 は glibc バ ー ジ ョ ン 2.9 で 追 加 さ れ た 。
準 拠
こ れ ら の 関 数 は 非 標 準 で あ る 。 BSD に は 同 様 の 関 数 が 存 在 す る が 、 BSD で は 必 要 な ヘ ッ ダ ー フ ァ イ ル は <endian.h> で は な く <sys/endian.h> で あ る 。 不 幸 な こ と に 、 NetBSD, FreeBSD, glibc で は 、 こ れ ら の 関 数 の 元 々 の OpenBSD で の 、 nn は 常 に 関 数 名 の 末 尾 に 置 く と い う 名 前 付 け ル ー ル が 踏 襲 さ れ て い な い (そ の た め 、 例 を 挙 げ る と 、 OpenBSD の "betoh32" と 等 価 な 関 数 は NetBSD, FreeBSD, glibc で は "be32toh" と な る )。
注 意
こ れ ら の 関 数 は 、 前 か ら あ る byteorder(3) 系 の 関 数 と 同 じ で あ る 。 例 え ば 、 be32toh() は ntohl() と 等 価 で あ る 。
byteorder(3) 系 の 関 数 の メ リ ッ ト は 、 こ れ ら が 全 て の UNIX シ ス テ ム で 利 用 可 能 な 標 準 関 数 で あ る 点 で あ る 。 一 方 で 、 こ れ ら の 関 数 は TCP/IP 処 理 で 使 用 さ れ る こ と を 想 定 し て 設 計 さ れ た た め 、 こ の ペ ー ジ で 説 明 し て い る 64 ビ ッ ト 版 や リ ト ル エ ン デ ィ ア ン 版 な ど が 存 在 し な い 。
例
以 下 の プ ロ グ ラ ム は 、 整 数 を ホ ス ト バ イ ト オ ー ダ ー か ら リ ト ル エ ン デ ィ ア ン と ビ ッ ト エ ン デ ィ ア ン の 両 方 の バ イ ト オ ー ダ ー に 変 換 し 、 そ の 結 果 を 表 示 す る 。 ホ ス ト バ イ ト オ ー ダ ー は リ ト ル エ ン デ ィ ア ン か ビ ッ ト エ ン デ ィ ア ン の い ず れ か な の で 、 変 換 に 意 味 が あ る の は ど ち ら か 一 方 だ け で あ る 。 こ の プ ロ グ ラ ム を x86−32 な ど の リ ト ル エ ン デ ィ ア ン の シ ス テ ム で 実 行 し た 場 合 の 実 行 結 果 は 下 記 の よ う に な る 。
$
./a.out
x.u32 = 0x44332211
htole32(x.u32) = 0x44332211
htobe32(x.u32) = 0x11223344 プ ロ グ
ラ ム の ソ ー
ス
#include <endian.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
union {
uint32_t u32;
uint8_t arr[4]; }
x;
/* Lowest−address byte */ |
x.arr[1] = 0x22;
x.arr[2] = 0x33;
/* Highest−address byte */ |
printf("x.u32
= 0x%x\n", x.u32);
printf("htole32(x.u32) = 0x%x\n", htole32(x.u32));
printf("htobe32(x.u32) = 0x%x\n",
htobe32(x.u32));
exit(EXIT_SUCCESS); }
関 連 項 目
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。