2009-06-24 33 views
14

मैं सीआईडीआर नोटेशन (72.20.10.0/24) में किसी नेटवर्क को कनवर्ट करने के लिए कुछ सी # कोड खोजने के लिए काफी कुछ देख रहा हूं, बिना किसी किस्मत के आईपी एड्रेस रेंज में। स्टैक ओवरलो पर सीआईडीआर के बारे में कुछ धागे हैं, लेकिन किसी के पास कोई सी # कोड नहीं है और मुझे जो चाहिए वह बिल्कुल कवर करता है। इसलिए मैंने इसे स्वयं बनाने का फैसला किया, और मैं नहीं चाहता था कि कोड इस संस्करण में किसी भी रूपांतरण के लिए System.Net पर भरोसा करे।सीआईडीआर को सी # में नेटवर्क और आईपी एड्रेस रेंज में कैसे परिवर्तित करें?

शायद यह किसी के लिए मदद की जा सकती है।

संदर्भ:

What's the best way to convert from network bitcount to netmask?

"Whatmask" सी से http://www.laffeycomputer.com/whatmask.html

प्रयोग कोड:

uint startIP, endIP; 
Network2IpRange("72.20.10.0/24", out startIP, out endIP); 

कोड सब कुछ के लिए 32 बिट मान लिया गया है।

static void Network2IpRange(string sNetwork, out uint startIP, out uint endIP) 
{   
    uint ip,  /* ip address */ 
     mask,  /* subnet mask */    
     broadcast, /* Broadcast address */ 
     network; /* Network address */ 

    int bits;    

    string[] elements = sNetwork.Split(new Char[] { '/' });   

    ip = IP2Int(elements[0]); 
    bits = Convert.ToInt32(elements[1]); 

    mask = ~(0xffffffff >> bits); 

    network = ip & mask; 
    broadcast = network + ~mask; 

    usableIps = (bits >30)?0:(broadcast - network - 1); 

    if (usableIps <= 0) 
    { 
     startIP = endIP = 0; 
    } 
    else 
    { 
     startIP = network + 1;    
     endIP = broadcast - 1; 
    } 
} 

public static uint IP2Int(string IPNumber) 
{ 
    uint ip = 0; 
    string[] elements = IPNumber.Split(new Char[] { '.' }); 
    if (elements.Length==4) 
    { 
     ip = Convert.ToUInt32(elements[0])<<24; 
     ip += Convert.ToUInt32(elements[1])<<16; 
     ip += Convert.ToUInt32(elements[2])<<8; 
     ip += Convert.ToUInt32(elements[3]); 
    } 
    return ip; 
} 

अपने सुधार सबमिट करने के लिए स्वतंत्र महसूस करें।

+0

यह मेरे लिए उपयोगी था, धन्यवाद। –

उत्तर

3

कदम एक network/maskBits के लिए इस तरह जाना होगा,

आप इन दो तरीकों में से एक में mask गणना,

mask = ~((1 << (32 - maskBits)) - 1) // or, 
mask = ~(0xFFFFFFFF >> maskBits) 

तो सीमा है,

StartIP = network 
EndIP = network | ~mask 

अधिक स्पष्ट ,

StartIP = network & mask 
EndIP = (network & mask) | ~mask 

कहाँ,

  • << बिटवाइज़ छोड़ पारी (रोल ओवर के बिना)
  • & बिटवाइज़ है और,
  • | बिटवाइज़ है या, और
  • ~ बिटवाइज़ उलटा है।
+0

'मास्क = ~ (0xFFFFFFFF >> मास्क बिट्स) 'मास्कबिट्स 32 है जब सही मान नहीं देगा - 0xFFFFFFFF –

+0

के बजाय मान 0x0 होगा वास्तव में मुझे काम करने के लिए इन तरीकों में से कोई भी नहीं मिला। '~ (0xFFFFFFFF >> 24)' 255.255.255.0' के बजाय '0.255.255.255' देता है। मेरे लिए क्या काम था: '0xFFFFFFFF >> -24' – cogumel0

6

यहाँ कैसे आप अपने उदाहरण 72.20.10.0/24 के लिए यह करना है,

Let हो Network72.20.10.0
Mask~((1 << (32-24)) - 1) // या
Mask है ~(0xFFFFFFFF >> 24)

  • जो 0xFFFFFF00
है

स्टार्टिप है - (Network & Mask);

  • जो है 72.20.10.0 & 0xFFFFFF00

EndIP है - ((Network & Mask) | ~Mask);

  • है जो (72.20.10.0 & 0xFFFFFF00) | 0x000000FF

यह 72.20.10.0 -- 72.20.10.255 हो जाएगा।

17

मैं Github से सी # आईपीनेटवर्क क्लास का उपयोग करने की सलाह देता हूं।

string net = "192.168.168.100/24"; 
IPNetwork ipnetwork = IPNetwork.Parse(net); 

Console.WriteLine("Network : {0}", ipnetwork.Network); 
Console.WriteLine("Netmask : {0}", ipnetwork.Netmask); 
Console.WriteLine("Broadcast : {0}", ipnetwork.Broadcast); 
Console.WriteLine("FirstUsable : {0}", ipnetwork.FirstUsable); 
Console.WriteLine("LastUsable : {0}", ipnetwork.LastUsable); 
Console.WriteLine("Usable : {0}", ipnetwork.Usable); 
Console.WriteLine("Cidr : {0}", ipnetwork.Cidr); 

यह

Network : 192.168.168.0 
Netmask : 255.255.255.0 
Broadcast : 192.168.168.255 
FirstUsable : 192.168.168.1 
LastUsable : 192.168.168.254 
Usable : 254 
Cidr : 24 

मज़ा ouput होगा।

2

यहाँ कैसे T-SQL, from my blog post में एक श्रृंखला के लिए CIDR संकेतन कन्वर्ट करने के लिए है:

पहले पूर्व बनाने एसक्यूएल सर्वर में इस समारोह ( http://www.stardeveloper.com से)।

CREATE FUNCTION [dbo].[ConvertIPToLong](@IP varchar(15)) 
RETURNS bigint 
AS 
BEGIN 
    DECLARE @Long bigint 
    SET @Long = CONVERT(bigint, PARSENAME(@IP, 4)) * 256 * 256 * 256 + 
     CONVERT(bigint, PARSENAME(@IP, 3)) * 256 * 256 + 
     CONVERT(bigint, PARSENAME(@IP, 2)) * 256 + 
     CONVERT(bigint, PARSENAME(@IP, 1)) 

    RETURN (@Long) 
END 

यह T-SQL कोड का एक नमूना मैं एक साथ रखा सीआईडीआर पता से निम्न और उच्च IP सीमाओं की गणना करेगा कि है। यह गन्दा है और मुझे टी-एसक्यूएल की बिट शिफ्ट ऑपरेटरों की कमी के आसपास काम करना पड़ा।

Declare @CidrIP varchar(50) 
Set @CidrIP = '10.100.60.55/28' 

Select dbo.[ConvertIPToLong](left(@CidrIP, patindex('%/%' , @CidrIP) - 1)) & (cast(4294967295 as bigint)^(Power(2, 32 - Cast(substring(@CidrIP, patindex('%/%' , @CidrIP) + 1, 2) as int)) - 1)) as LowRange, 
     dbo.[ConvertIPToLong](left(@CidrIP, patindex('%/%' , @CidrIP) - 1)) & (cast(4294967295 as bigint)^(Power(2, 32 - Cast(substring(@CidrIP, patindex('%/%' , @CidrIP) + 1, 2) as int)) - 1)) + (Power(2, 32 - Cast(substring(@CidrIP, patindex('%/%' , @CidrIP) + 1, 2) as int)) - 1) 
संबंधित मुद्दे