2009-03-15 14 views
2

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

+0

gccのエラーは、VC++でそれを行う方法を求めているのはなぜですか? とにかく、_byteswap_ulongは標準関数ではありません。 – jalf

答えて

1

Docsこれらの関数はstdlib.hにあります。 POSIX準拠のシステムで

+1

アンダースコアで始まるものは、定義によって非標準です。 –

+1

私は彼が標準的な方法を求めていたとは思わない、彼はVC++の方法を尋ねていた。 –

8

、あなたは、標準のバイトスワップ(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); 

を(ホストとネットワーク長、ホスト名により示唆されるように、これらは、ネットワークの使用のために特別に意図されていますネットワーク短-to、等)

GNUおよびBSDシステムもエンディアンを提供する(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の上に、ビット幅の番号はの終わりに常に関数:be 。64toh()対betoh64()など)

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

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

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

+0

+1ですが、ライブラリ関数を使用するときに自動的に使用されるため、組み込み関数を使用する必要はありません。 –

+0

私はそれに頼っていません。コンパイラが3命令SSEに相当するfsqrt()を呼び出すことは決してありません。 – greyfade

+0

greyfade:それは異なります。 VC++には組み込み関数に組み込み関数を使用するオプションがあります。もちろん、SSEをサポートするプラットフォームをターゲットにする必要があります。 GCCにも同様のオプションがあります。しかし、SSEが利用可能であることをコンパイラーに指定しないと、SSEは使用されません。 – jalf