• Status: Solved
• Priority: Medium
• Security: Public
• Views: 2003

# IP adreses calc from subnet mask

How to write procedure where I can from example 192.168.0.0/24 get all IP adress 192.168.0.1- 192.168.0.255 into stringlist. where is mask is 24 there is simple but how to make where ip with mask is 213.21.192.0/18 or 192.168.0.30/28
0
KarlisB
• 5
• 2
1 Solution

Author Commented:
Maybe someone can give procedure to make like :

and calculate first IP address and last IP address
0

Commented:
I am not conversant in IP traffic, but it appears the number after the slash shows you the number of bit to turn on in the mask.

16 -> Mask: 255.255.0.0

I'll try to implement an algorithm to give you a list. (Correct me if my interpretation is wrong).

0

Commented:
Here is the code to list the IP in tha range given the IP & the mask bits.  I have simply used logical operands to expand the list.

Call the 'GetIPList' function with two arguments: IP-v4 address, and the MaskBits.

e.g., GetIPList('192.168.0.0', 22);

``````type TIPSegments = array[1..4] of byte;

function NumberToSegments(Number:longword):TIPSegments;

var j : 0..4;

begin;
for j := 4 downto 1 do
begin;
result[j] := Number mod 256;
Number := Number div 256;
end;
end;

function IPToSegments(ip:string):TIPSegments;

var i : byte;
j : 0..4;
s : string;

begin;
for j := 1 to 4 do
begin;
i := pos('.', ip);
if j < 4 then s := copy(ip, 1, i-1) else s := ip;
delete(ip, 1, i); //remove '.'
result[j] := StrToInt(s);
end;
end;

function IPToNumber(ip:string):longword;

var segment : TIPSegments;
i : 1..4;

begin;
segment := IPToSegments(ip);
result := 0;
for i := 1 to 4 do
result := result * 256 + segment[i];
end;

function NumberToIP(Number:longword):string;

var segment : TIPSegments;
i : 1..4;

begin;
result := '';
segment := NumberToSegments(Number);
result := Format('%d.%d.%d.%d', [segment[1], segment[2], segment[3], segment[4]]);
end;

var
IP   :LongWord;
i, w : longword;

begin;
IP := IPToNumber(IPStr);

WildCard := 1 shl (32 - MaskBits) - 1;
NetMask := not WildCard;

leWildCard.text := NumberToIP(WildCard);

ListBox1.Items.Clear;
for w := 1 to WildCard - 1 do
begin;
i := IP or w;
end;
leCount.text    := IntToStr(ListBox1.Items.Count);
end;
``````
0

Commented:
by the way, it appears that you'd need a Stringlist with duplicates set to dupIgnore, instead of a ListBox to make this work for any generic IP address.

0

Author Commented:
please give what type of variables is:

Wildcard
IeWildcard

bacause I have:

[Error] Unit2.pas(106): Undeclared identifier: 'WildCard'
[Error] Unit2.pas(107): Undeclared identifier: 'NetMask'
[Error] Unit2.pas(109): Undeclared identifier: 'leWildCard'
0

Commented:
Type for WildCard and NetMask is LongWord.  Anything where name starts with le* is just a TEdit which I used to display the calculated value.

Just to give a quick comment about what I am doing:

1. Convert the IP address in to an integer (There are four 'segments' each going from 0 to 255, i.e. 8 bits. so you need a total of 32 bits hence the LongWord  -for IP-v4)

2. WildCard is an integer correspoding to the Mask.

3. NetMask is the (binary) inverse of the WildCard which has to be 'Logical-OR'ed with the original IP to get the list.

0

Commented:
My wording isn't clear above:

2.  WildCard corresponds to the number of bits in the Mask, and that is the one you have to "Logical-OR' with the IP to get the list.

3.  NetMask is the binary inverse of WildCard, and gives you the 'SubNet Mask' in the traditional form (e.g. 255.255.255.0).
0

## Featured Post

• 5
• 2
Tackle projects and never again get stuck behind a technical roadblock.