0

タイトルにあるように、私が取得しているデータgethostbynameの最初のビットが壊れているようです。

以下に短い例を示します。

struct hostent* host=  gethostbyname("indiana.cs.rit.edu");

if (!host)
    exit(-1);


printf("%d.%d.%d.%d\n", (host->h_addr_list[0][0]),
                        (host->h_addr_list[0][1]),
                        (host->h_addr_list[0][2]),
                        (host->h_addr_list[0][3]));


printf("%d.%d.%d.%d\n",UP(host->h_addr_list[0][0]),
                       UP(host->h_addr_list[0][1]),
                       UP(host->h_addr_list[0][2]),
                       UP(host->h_addr_list[0][3]));

UP は次のように定義されます。

#define UP(X) (((int)X) & 0XFF)

上記のコードの出力は次のとおりです。

-127.21.37.10129.21.37.10

inet_ntoaこれで、char* バージョンの IP アドレスを取得するためにを使用する必要があることがわかりました。ただし、最初のバイトが壊れている理由を誰か知っていますか? host->h_addr_list最初のアドレスから char** を取得している[]ため、最初のアドレス[]を参照し、2 番目のアドレスは実際の文字を逆参照する必要があります。char が 1 バイトであるのに、マングルされたビットをクリアするためにビット単位の演算子を実行する必要があるのはなぜですか?

混乱の層に加えて、-127 または 129 を取得している理由です。

たとえば、バイナリでは、1 バイトの 129 は次のようになります。

1000 0001

ただし、-127 の値に基づいて、私の基本的なバイナリ値がであることを示唆しています。

1111 1111

今、私が本当に混乱しているのは、0XFF (1111 1111) のビット演算子が 129 を返す方法です。余分なデータはどこから来ていますか?

事前に助けてくれてありがとう。

4

1 に答える 1