2011-12-03 7 views
2

ネットワーク上で符号付きlong(32ビット整数)を転送したい場合、私は何をしますか?私が長い間、署名されたものとして送信すると、リモートマシンがどのように署名された数字を表すのか(潜在的に)わからないでしょうか?では私は何をしますか?なぜ署名付きロング用のソケットntolがないのですか?

+0

それをどのように解釈するか教えてください。 –

+0

[Signed Integer Network and Host Conversion]の複製が可能です(http://stackoverflow.com/questions/4878781/signed-integer-network-and-host-conversion) – outis

答えて

2

ntohl()はバイトオーダーで動作するので、記号については気にしません。気になるのは、いくつのビットがあるかです。タイトルの質問に答える。

「私は何をしますか?」という質問に答えるには?あなたが質問をしているというだけでなく、署名されているかどうかを知らない以外にも、この番号があなたの特定のリモートこの問題についてもっと知識があるかもしれません。

+0

OKだから私はちょうど私がそれを署名したものとしてマークすると、もう片方で私は戻って変換するのに必要なことをやるでしょう。 –

+0

コンパイラが主張している場合は、 'htonl'を実行する前に' unit32_t'にキャストし、 'ntohl'を介して処理するときに署名するようにcasバックすることができます。 –

1

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

また、負の数値について独自のネットワーク表現を定義し、独自のntohslhtonslを記述します。

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

+0

POSIXによると、整数型intN_tは2の補数でなければなりません。 'ntohl'関数はPOSIXの一部です。 –

+0

@DietrichEpp:ISO Cではまた、2つの補数と、最も負の値を有効にする(トラップではない)必要があります。 –

+0

整数を文字列に変換して戻すことは、非常に非効率的な方法のように聞こえます。 –

6

ntohlhtonlを使用して、uint32_tint32_tの間でキャストまたは暗黙的に変換してください。

関連する問題