7

Windows IP Helper APIを使用するC#コードを書いています。私が呼び出そうとしている関数の1つは、IPの「uint」表現をとる「 GetBestInterface 」です。私が必要としているのは、IPのテキスト表現を解析して、「uint」表現を作成することです。

これこれのようなグーグル経由でいくつかの例を見つけましたが、.NETでこれを達成するための標準的な方法があるはずだと確信しています。唯一の問題は、この標準的な方法が見つからないことです。IPAddress.Parseは正しい方向にあるように見えますが、「uint」表現を取得する方法を提供していません。

IP Helperを使用して、ParseNetworkStringを使用してこれを行う方法もありますが、繰り返しになりますが、.NETを使用したいと思います。pInvokeへの依存度が低いほど良いと思います。

だから、誰もが.NETでこれを行うための標準的な方法を知っていますか?

4

9 に答える 9

18

そうではありませんか:

var ipAddress = IPAddress.Parse("some.ip.address");
var ipBytes = ipAddress.GetAddressBytes();
var ip = (uint)ipBytes [0] << 24;
ip += (uint)ipBytes [1] << 16;
ip += (uint)ipBytes [2] <<8;
ip += (uint)ipBytes [3];

?

于 2009-02-16T13:34:14.967 に答える
12

MSDNによると、IPAddress.Addressプロパティ(IPアドレスの数値表現を返す)は廃止されたため、 GetAddressBytesメソッドを使用する必要があります。

次のコードを使用して、IPアドレスを数値に変換できます。

var ipAddress = IPAddress.Parse("some.ip.address");
var ipBytes = ipAddress.GetAddressBytes();
var ip = (uint)ipBytes [3] << 24;
ip += (uint)ipBytes [2] << 16;
ip += (uint)ipBytes [1] <<8;
ip += (uint)ipBytes [0];

編集:
他のコメント提供者が気づいたように、上記のコードはIPv4アドレス専用です。IPv6アドレスは128ビット長であるため、質問の作成者が望んでいたように「uint」に変換することはできません。

于 2008-08-31T12:55:45.380 に答える
12
var ipuint32 = BitConverter.ToUInt32(IPAddress.Parse("some.ip.address.ipv4").GetAddressBytes(), 0);`

このソリューションは、手動のビット シフトよりも読みやすいです。

C# で IPv4 アドレスを整数に変換する方法を参照してください。

于 2008-08-31T23:01:31.820 に答える
5

また、 IPv4IPv6は長さが異なることを覚えておく必要があります。

于 2008-08-31T14:13:11.370 に答える
1

バイト演算は、すべてのIPが4オクテットのものであることに依存しているため、お勧めしません。

于 2008-08-31T12:59:35.993 に答える
1
System.Net.IPAddress ipAddress = System.Net.IPAddress.Parse("192.168.1.1");

byte[] bytes = ipAddress.GetAddressBytes();
for (int i = 0; i < bytes.Length ; i++)
       Console.WriteLine(bytes[i]);

出力は 192 168 1 1 になります

于 2010-10-10T10:59:33.707 に答える
1

エンディアンを観察する正しい解決策:

var ipBytes = ip.GetAddressBytes();
ulong ip = 0;
if (BitConverter.IsLittleEndian)
{
    ip = (uint) ipBytes[0] << 24;
    ip += (uint) ipBytes[1] << 16;
    ip += (uint) ipBytes[2] << 8;
    ip += (uint) ipBytes[3];
}
else
{
    ip = (uint)ipBytes [3] << 24;
    ip += (uint)ipBytes [2] << 16;
    ip += (uint)ipBytes [1] <<8;
    ip += (uint)ipBytes [0];
}
于 2019-09-17T19:06:46.383 に答える
0

この問題のクリーンな解決策(つまり、.NET Frameworkのクラス/メソッド)は見つかりませんでした。あなたが提供した解決策/例またはAkuの例を除いて、それは利用できないと思います。:(

于 2008-08-31T12:56:19.277 に答える