9

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

LinuxとMacOSXで動作するルーチンを探しています。

4

3 に答える 3

7

それはどうでもいい事です。htonlは、数値の算術値ではなく、バイトに関係します。必要に応じて、reinterpret_castを使用して番号を符号なしに変更し、元に戻します。

于 2011-02-02T19:15:20.517 に答える
2

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

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

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

于 2011-12-03T19:33:41.493 に答える
0

gccを使用している場合は、この目的のための一連の組み込みがあります。それらは通常、単一の命令にコンパイルされます。

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
于 2016-08-18T01:56:37.597 に答える