0

こんにちは、fe 255.128.0.0 というネットマスクがあります。これは正しいネットマスクです。確認する必要があります。

int s; 
struct in_addr ipvalue;
s = inet_pton(AF_INET, argv[1], &ipvalue);

印刷すると、魔女がバイナリ形式であることがsわかりますが、これは入力ネットマスクと等しくないので、ネットマスクが正しいかどうかを確認するにはどうすればよいですか? 今、10 進形式のネットマスクとありがとうを比較してチェックしています。3302300000000.00000000.10000000.11111111for (int i = 31; i >=0; i--) sm |= (1 << i);

4

2 に答える 2

2

私が印刷した場合、si see 33023 魔女はバイナリ形式で 00000000.00000000.10000000.11111111 です

あなたの問題はエンディアンの問題のようです。

次のことを試してください。

int s; 
struct in_addr ipvalue;
s = inet_pton(AF_INET, argv[1], &ipvalue);
s = ntohl(s);

これでバイトオーダーの問題が修正されるはずです。

于 2014-08-08T10:06:49.743 に答える
0

あなたが何をしたとしても、それは正しいです!ただしinet_pton、変換されたサブネットマスクをビッグ エンディアン形式で返します。そのため、リトル エンディアンに変換する必要があります。次に、実際のサブネットマスクを取得します。

sまた、変換の戻り値は に格納されるため、出力しないでくださいs。の構造体メンバーを出力してみてくださいipvaluestruct in_addr含む-

struct in_addr {
unsigned long s_addr;  
};

そのため、ネットワーク バイト オーダーからホスト バイト オーダーへの変換中にipvalue.s_addr!

次のコードを試してください -

    int s,i;
    struct in_addr ipvalue;
    unsigned long num;

    s = inet_pton(AF_INET, argv[1], &ipvalue);

    num=ntohl(ipvalue.s_addr); // converts network to host byte order!

    for(i=31;i>=0;i--){
            if(num&1<<i)
                    printf("1");
            else
                    printf("0");
    }
    printf("\n");
于 2014-08-08T10:32:09.700 に答える