2

C++ でビッグ エンディアン値とリトル エンディアン値を変換するにはどうすればよいですか? 私は VC++ 6.0 を使用しています。_byteswap_ulong() 関数を使用した場合、ヘッダー ファイル intrin.h が必要です。ヘッダーを含めると、互換性のないコンパイラーと intrin.h が gcc コンパイラー用であるというエラーが報告されます。この関数以外に、VC++ でビッグ エンディアンとリトル エンディアンの値を変換する関数はありますか?

4

2 に答える 2

9

POSIX 準拠のシステムでは、標準の byteswap(3) 関数があります。

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

これらは、名前が示すように、特にネットワークでの使用を目的としています (ホストからネットワークへのロング、ホストからネットワークへのショートなど)。

GNU および BSD システムも endian(3) 関数を提供します。

#define _BSD_SOURCE
#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);

(OpenBSD では、ビット幅の数値は常に関数の末尾にあります。たとえば、be64toh() と betoh64() の違いです。)

それ以外の場合は、ほとんどの人が独自のマクロまたは関数を定義します。

#define bswap16(x) ((x)>>8 | ((x)&255)<<8)
#deinfe bswap32(x) ((bswap16((x)>>16)&65535)|(bswap16((x)&65535)<<16))
/* etc. */

x86 の bswap 命令のように、アセンブリ組み込み関数を使用することもできます。__builtin_bswap64GCCおよびICCで。VS7.0以降、VSには似たようなものがあります。

于 2009-03-15T17:45:00.833 に答える
1

ドキュメントは、これらの関数が stdlib.h にあると言っているようです。

于 2009-03-15T17:27:21.310 に答える