كيف يمكنك تحليل عنوان IP السلسلة إلى uint قيمة في C# ؟

StackOverflow https://stackoverflow.com/questions/36831

سؤال

أنا أكتب C# كود يستخدم ويندوز IP Helper API.واحدة من وظائف أحاول الإتصال "GetBestInterface"أن يأخذ 'uint تمثيل الملكية الفكرية.ما أريده هو أن تحليل التمثيل النصي الملكية الفكرية لخلق 'uint تمثيل.

لقد وجدت بعض الأمثلة عن طريق جوجل, مثل هذا واحد أو هذا واحد, ولكن أنا متأكد من يجب أن يكون هناك طريقة قياسية لتحقيق هذا .صافي.المشكلة الوحيدة هي أنني لا يمكن العثور على هذه الطريقة القياسية.IPAddress.تحليل يبدو في الاتجاه الصحيح, ولكن انها لا تقدم أي طريقة الحصول على 'uint تمثيل...

هناك أيضا طريقة للقيام بذلك باستخدام مساعد IP باستخدام ParseNetworkString, ولكن مرة أخرى أنا أفضل استخدام .صافي - أعتقد أقل أنا أعتمد على pInvoke أفضل.

لذا أي أحد يعرف طريقة قياسية أن تفعل هذا .الشبكة ؟

هل كانت مفيدة؟

المحلول

MSDN يقول أن IPAddress.عنوان العقار (والتي ترجع التمثيل العددي من عنوان 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 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];

?

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

هذا الحل هو أسهل في القراءة من دليل بت التحول.

انظر كيفية تحويل عنوان IPv4 إلى عدد صحيح في C# ؟

كما يجب أن نتذكر أن IPv4 و IPv6 هي أطوال مختلفة.

بايت الحساب بالإحباط ، لأنها تعتمد على جميع IPs 4-ثماني بتات منها.

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

لم يسبق لي أن وجدت الحل نظيفة (أي:فئة / طريقة في .NET Framework) لهذه المشكلة.أظن أن الأمر لا يتوفر إلا الحلول / الأمثلة التي قدمتها أو أكو سبيل المثال.:(

الحل الكامل:

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 مع الإسناد
لا تنتمي إلى StackOverflow
scroll top