簡體   English   中英

如何在 C# 中將 IP 地址字符串解析為 uint 值?

[英]How do you parse an IP address string to a uint value in C#?

我正在編寫使用 Windows IP Helper API 的 C# 代碼。 我試圖調用的函數之一是“ GetBestInterface ”,它采用 IP 的“uint”表示。 我需要的是解析 IP 的文本表示以創建“uint”表示。

我通過 Google 找到了一些示例,例如this onethis one ,但我很確定應該有一種標准方法可以使用 .NET 實現這一點。 唯一的問題是,我找不到這種標准方式。 IPAddress.Parse 似乎是在正確的方向,但它不提供任何方式獲得 'uint' 表示......

還有一種使用 IP Helper 的方法,使用ParseNetworkString ,但同樣,我寧願使用 .NET - 我相信我越少依賴 pInvoke 越好。

那么,有人知道在 .NET 中執行此操作的標准方法嗎?

不應該是:

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];

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”。

var ipuint32 = BitConverter.ToUInt32(IPAddress.Parse("some.ip.address.ipv4").GetAddressBytes(), 0);`

該解決方案比手動位移更容易閱讀。

請參閱如何在C#中將IPv4地址轉換為整數?

您還應該記住IPv4IPv6的長度不同。

不鼓勵字節算術,因為它依賴於所有4個八位字節的IP。

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

觀察字節序的正確解決方案:

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];
}

我從來沒有找到一個干凈的解決方案(即:.NET Framework中的類/方法)來解決這個問題。 我想除了您提供的解決方案/示例或Aku的示例之外,它不可用。 :(

完整解決方案

public static uint IpStringToUint(string ipString)
{
    var ipAddress = IPAddress.Parse(ipString);
    var ipBytes = ipAddress.GetAddressBytes();
    var ip = (uint)ipBytes [0] << 24;
    ip += (uint)ipBytes [1] << 16;
    ip += (uint)ipBytes [2] <<8;
    ip += (uint)ipBytes [3];
    return ip;
}

public static string IpUintToString(uint ipUint)
{
    var ipBytes = BitConverter.GetBytes(ipUint);
    var ipBytesRevert = new byte[4];
    ipBytesRevert[0] = ipBytes[3];
    ipBytesRevert[1] = ipBytes[2];
    ipBytesRevert[2] = ipBytes[1];
    ipBytesRevert[3] = ipBytes[0];
    return new IPAddress(ipBytesRevert).ToString();
}

字節的反向順序:

public static uint IpStringToUint(string ipString)
{
    return BitConverter.ToUInt32(IPAddress.Parse(ipString).GetAddressBytes(), 0);
}

public static string IpUintToString(uint ipUint)
{
    return new IPAddress(BitConverter.GetBytes(ipUint)).ToString();
}

你可以在這里測試:

https://www.browserling.com/tools/dec-to-ip

http://www.smartconversion.com/unit_conversion/IP_Address_Converter.aspx

http://www.silisoftware.com/tools/ipconverter.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM