高手请进,IP字段值比较//等待中,出丁点的意见也非常感谢! ( 积分: 50 )

  • 主题发起人 主题发起人 lucarl
  • 开始时间 开始时间
L

lucarl

Unregistered / Unconfirmed
GUEST, unregistred user!
第一次提问题,实在没办法了。
我的情况是:
在前台输入一段IP地址 比方说:192.168.1.1-192.168.1.255
在后台数据库中存入IP地址。在表中对应的唯一标示IP字段值的对应字段
而且,该对应字段的生成是用VC++通过inet_addr()生成,
比如:
在数据库中
IP字段(varchar) 对应的IP字段(int)
192.168.1.106 -1062731414

但我在Delphi7.0中,用winsock api函数inet_addr()转换
192.168.1.106 对应的值为 1778493632

我想实现的功能:
取出两个IP字段区域的值,如:192.168.0.1-192.168.0.244
这样的比较没问题,都是负数比较大小。
可如果用户输入127.0.0.1-192.168.0.1,就没办法按正常方法解决了。
类似这样的情况:
可是在查询的时候我必须考虑到三点:
两个IP字段输入值,IP1,IP2
1、两个都是正数;
2、IP1是正数,IP2是负数;
3、两个是负数;
如何进行一个换算,重要的是在数据库中查询,因为数据库中如果是负数的话,正好前台相反。诸位仁兄,再次感谢!指条路!
 
第一次提问题,实在没办法了。
我的情况是:
在前台输入一段IP地址 比方说:192.168.1.1-192.168.1.255
在后台数据库中存入IP地址。在表中对应的唯一标示IP字段值的对应字段
而且,该对应字段的生成是用VC++通过inet_addr()生成,
比如:
在数据库中
IP字段(varchar) 对应的IP字段(int)
192.168.1.106 -1062731414

但我在Delphi7.0中,用winsock api函数inet_addr()转换
192.168.1.106 对应的值为 1778493632

我想实现的功能:
取出两个IP字段区域的值,如:192.168.0.1-192.168.0.244
这样的比较没问题,都是负数比较大小。
可如果用户输入127.0.0.1-192.168.0.1,就没办法按正常方法解决了。
类似这样的情况:
可是在查询的时候我必须考虑到三点:
两个IP字段输入值,IP1,IP2
1、两个都是正数;
2、IP1是正数,IP2是负数;
3、两个是负数;
如何进行一个换算,重要的是在数据库中查询,因为数据库中如果是负数的话,正好前台相反。诸位仁兄,再次感谢!指条路!
 
IP是DWORD,可以一个一个字节比较
1个字节代表'.'旁边的一个数,
用位操作进行比较。
 
能否给段代码,给点提示,好吗?谢谢,张大侠!
 
不知道你是怎么操作的
这两个应该是一样的,主要是顺序不同
var
iip1,iip2: integer;
begin
iip1 := -1062731414;
iip1 := ntohl(iip1);
iip2 := 1778493632;
showmessage(inttohex(iip1,4)+','+inttohex(iip2,4));
end.
iip1 C0A8016A
iip2 6A01A8C0
通过ntohl或者htonl转化一下就相同了
一个是网络顺序,一个是本机的顺序(姑且这样叫)
 
能否解释一下 何谓 ntohl() 和htonl()
还有如何进行查询比较呢?我指的是前台的判断
 
在delphi中如何判断一个值是正数还是负数?
 
if iip1>=0 then
showmessage('正数')
else
showmessage('负数');
 
StartAddress := htonl(inet_addr(PChar(Form1.Edit1.Text)));
EndAddress := htonl(inet_addr(PChar(Form1.Edit2.Text)));
if StartAddress > EndAddress then begin
Ferror := 'startIP cannot be greater than endIP.';
exit;
end;

is this you want?
 
Thanks!
But,to be honest,a little different!
I want to realise to compare value (which is biger or not) in Delphi.
Esp IP1 --- Positive
IP2 --- Negative
How to deal with it !
 
i think you just want to compare 2 ip address,
before compare, you should make sure them in same byte order;

in you case,
the ip in database is TCP/IP byte order,
but ip in Delphi is host byte order,

use following formula to get ip value by TCP/IP byte order in Delphi,
htonl(inet_addr(PChar(Form1.Edit1.Text)));
fyi
htonl(1778493632)=-1062731414

比如:
在数据库中
IP字段(varchar) 对应的IP字段(int)
192.168.1.106 -1062731414

但我在Delphi7.0中,用winsock api函数inet_addr()转换
192.168.1.106 对应的值为 1778493632
 
Then,thanks a lot.
I can express that exactly.
I wander this case
192.168.0.1 ----> 19216801
I know to use format()
But I forgot pattern of it ,Could u tell me?
Hi,I want to know u much by my heart.Could u give me one chance.
This is my QQ number 51393279.With Regards!
 
StringReplace('192.168.0.1','.','',[rfReplaceAll])
 
thanks!
Could I see this case
eg:
192.168.0.1 --- 192168000001
192.168.1.2 --- 192168001002
10.134.244.2 --- 010134244002
Keep the same Byte as this number
Maybe,a litttle trouble.But,I am eager to get it!
 
procedure TForm1.Button1Click(Sender: TObject);
var
HostByteOrder:longint;
begin
HostByteOrder := inet_addr(PChar(Form1.Edit1.Text));
showmessage(Format('%.3d%.3d%.3d%.3d', [HostByteOrder and $FF,
(HostByteOrder shr 8) and $FF,
(HostByteOrder shr 16) and $FF,
(HostByteOrder shr 24) and $FF]));
 
thanks million!d_eng,my email is lucarl_315@yahoo.com.cn
keep contact me ,true, a chance. To tell u turth , admire a little
 
plus '0':
e.g:Str1:=AddZero('1',3);//'003';

Function AddZero(S:string;Len:byte):String;
Var
Len1:Byte;
begin
if len<14 then len1:=Len else len1:=14;
if length(S)>=Len1 then
Result:=S
else
Result:=Copy('00000000000000',1,len-length(S))+S;
end;
//
Function Tran1(S1:string):string;
var
S,Resu:string;
I,pos1,len;Byte;
begin
S:=S1;
Resu:='';
while Pos('.', S) > 0 do
begin
pos1:=Pos('.', S) ;
Resu:=Resu+AddZero(copy(S,1,Pos1),3);
len:=Length(S);
S:=copy(S,pos+1,Len-pos1);
end;
Resu:=Resu+AddZero(S,3);
Result:=resu;
end;
 
各位,能帮忙解决个小问题吗?
我换算的IP值为12位的,这个太大了,如何比较呢?
通过以上的进行换算 ,比方:192.168.0.1 ---- 192168000001(十二位)
我想传二个IP值,比大小 但是没办法老报出 '192168000001 is not a valid integer values'

这是我的源代码

procedure TForm1.Button1Click(Sender: TObject);
var
HostByteOrder:longint;
begin
HostByteOrder := inet_addr(PChar(Form1.IPEdit1.IPString));
edit1.Text := Format('%.3d%.3d%.3d%.3d', [HostByteOrder and $FF,
(HostByteOrder shr 8) and $FF,
(HostByteOrder shr 16) and $FF,
(HostByteOrder shr 24) and $FF]);

HostByteOrder := inet_addr(PChar(Form1.IPEdit2.IPString));
edit2.Text := Format('%.3d%.3d%.3d%.3d', [HostByteOrder and $FF,
(HostByteOrder shr 8) and $FF,
(HostByteOrder shr 16) and $FF,
(HostByteOrder shr 24) and $FF]);
if StrToInt(Edit1.Text) < StrToInt(edit2.Text) then
ShowMessage('Edit1 Small')
else
ShowMessage('Edit1 Big');
end
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
691
import
I
后退
顶部