2011-02-02 10 views
7

int32_tをホストバイトオーダーからネットワークバイトオーダーに変換したいと思います。私はhtonl()関数とその変種について知っていますが、これは符号なし整数をとります。符号付き整数でも同じことができる標準ライブラリ関数がありますか、それとも自分で実装する必要がありますか?それを自分で実装する必要がある場合は、どうすればいいですか?符号付き整数ネットワークとホスト変換

私はそれは問題ではありませんLinuxおよびMac OS Xの

+0

にコンパイル - 何があなたに起こらないでしょう符号ビットで行うことを望んでいるだけで符号なしの機能を使用し、キャスト? – Rup

答えて

8

上で動作するルーチンを見つけるために探しています。 htonlはバイトの数であり、数の算術値ではありません。 reinterpret_castを使用して番号を符号なしに変更し、必要に応じて元に戻します。

+11

彼はCを使用しているので、おそらく 'htonl((uint32_t)address);' – joeforker

+0

@joeforkerを呼び出して、オーバーフローの場合には未定義の動作につながるはずです。あなたのコメントを削除してください。代わりに 'memcpy'を使います。 – rightfold

+0

それは動作します、それは4バイトだけを交換します。オーバーフローはありません。 OTOH memcpy()はバイトを同じ順序で残します。 – joeforker

2

1つのシステム(Linuxを実行しているものがわからない場合)は、負の整数(例えば、1の補数、符号の大きさ、まれに可能ですが)を異なる表現で使用し、数字を文字列として送信し、 intを受信側に送信します。効率的ではありませんが、大量の数値を送信しない限り、それほど重要ではありません。送信する番号が多数ある場合は、何らかの圧縮形式を使用できます。

また、負の数に対して独自のネットワーク表現を定義し、独自のntohslとhtonslを記述します。

どちらのアプローチでも、各システムには、他の表現では表現できない1つの番号があります。この数字を受け取ったときの適切な行動方針を決定する必要があります。

0

gccを使用している場合は、この目的のためにbuiltinsのセットがあります。それらは通常、単一の命令にコンパイルされます。私のマシン上で

uint16_t __builtin_bswap16 (uint16_t x); 
uint32_t __builtin_bswap32 (uint32_t x); 
uint64_t __builtin_bswap64 (uint64_t x); 

、__builtin_bswap32()はどういう意味

bswap %eax 
関連する問題