2

こんにちは、4 つの整数を 1 つの整数に連結しようとしています。ここにある連結関数を使用しました:

https://stackoverflow.com/a/12700533/2016977

私のコード:

unsigned concatenate(unsigned x, unsigned y) {
    unsigned pow = 10;
    while(y >= pow)
        pow *= 10;
    return x * pow + y;        
}

void stringtoint(){
    struct router *ptr;
    ptr=start;

    while(ptr!=NULL){
        int a;
        int b;
        int c;
        int d;

        sscanf(ptr->ip, "%d.%d.%d.%d", &a, &b, &c, &d);
        int num1 = concatenate(a,b);
        int num2 = concatenate(c,d);
        int num3 = concatenate(num1,num2);
        printf("%d\n",num3);
        ptr=ptr->next;
    };

}

問題:

私はIPアドレス番号を扱っています.たとえば198.32.141.140、それらを4つの整数に分解し、それらを連結してフォーム 19832141140にしていますが、連結関数は(becomes)のような大きな数で計算を行っています198.32.141.140->-1642695340 しかし、小さな数字であるIPを連結しています.164.78.104.1となる164781041(正解)

198.32.141.140問題を解決するにはどうすればよいですか。基本的に、IPの文字列を整数にしようとしています19832141140

4

3 に答える 3

12

あなたが提案したアプローチは、おそらく非常に大きな間違いです。とどう見分ける127.0.1.1127.0.0.11

IP アドレスをそのまま扱う方がはるかに優れています。すなわちa.b.c.d

a * 256^3 + b * 256^2 + c * 256^1 + d * 256^0

このようにすれば、今説明した問題に遭遇することはおそらくありません。さらに、実装は簡単です。

unsigned int number;
number = (a << 24) + (b << 16) + (c << 8) + d
于 2013-08-17T16:37:58.357 に答える
3

1 行読んでから を使用できますinet_aton()。それ以外の場合は、ジェイソンの言うとおりにできますが、各整数値が 0 ~ 255 の範囲内であることを確認する必要があります (これらの 4 x 8 ビットは、IPv4 アドレスを含む 32 ビット整数を表します)。inet_aton()IPv4 アドレスの 16 進数、10 進数、および 8 進数表記をサポートします。

于 2013-08-17T16:41:25.210 に答える