大虾,来这里支招了,IP字段,可是,希望大家帮忙!要分可以在加 ( 积分: 20 )

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

lucarl

Unregistered / Unconfirmed
GUEST, unregistred user!
各位,能帮忙解决个小问题吗?
我换算的IP值为12位的,这个太大了,如何比较呢?
通过以上的进行换算 ,比方:192.168.0.1 ---- 192168000001(十二位)
我想传二个IP值,比大小 但是没办法老报出
[red]'192168000001 is not a valid integer values'[/red]

这是我的源代码

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
 
各位,能帮忙解决个小问题吗?
我换算的IP值为12位的,这个太大了,如何比较呢?
通过以上的进行换算 ,比方:192.168.0.1 ---- 192168000001(十二位)
我想传二个IP值,比大小 但是没办法老报出
[red]'192168000001 is not a valid integer values'[/red]

这是我的源代码

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
 
?? 没看懂楼主的意思,就是想比较IP大小吗?
这样不就行了? 为什么要转化成12个长度的字符呢?
if inet_addr(pchar(edit1.text))>inet_addr(pchar(edit2.text)) then
ShowMessage('Edit1 Small')
else
ShowMessage('Edit1 Big');
 
我知道,是这样,转换为整形,可以转。可是我要查询的是一个IP字段,
详细的我就不说了,我现在必须要完成这个功能
就是把IP转换为12位的 192.168.0.1 ---- 192168000001(十二位)
然后进行比较IP1 ,IP2 都转为 12位
我想明白如何比较,这么多的位数
谢谢您的关注!
 
if StrToInt64(Edit1.Text) < StrToInt64(edit2.Text) then
 
不是我说。。根本没有这么比的。。。

你也不说你要做什么。。。我估计你的想法本身就错了

当然 12位也不是不能比,你把他换成前6位(高位)和后6位(低位)
然后先比较高位,如果高位一样再比较低位
 
嗨!楼上,别生气。
是这样的,我两个IP输入框
输入两个IP值,我想带入数据到SQL进行查询
但前台要比较IP值,所以就这样比较。
我知道可以转化为整形,可是在数据库中已有相应的字段
你看看这里就这里就明白了
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3154867
 
问题不就是你的数据库中的IP可能是正数也可能是负数吗?
你先判断一下不就行了?如果是负数用ntohl转化一下

另外你说的数据库查询,最好能统一,要么都是正的,要么都是负的
 
不明白为什么要用fromat 转换比较。。呵呵 我英语太差 中间那部分没看懂。。

还有那个127.0.0.1-192.168.1.1为什么不能比较?
 
这个,是这样的,问题已经解决了。我可以告诉你,
刚开始的时候,我也没想明白
可是真正在写代码时我意识到了,还有,数据库我是没办法改的,
那你说我还有什么更好的方法吗?
前台如果输入 127.0.0.1 --- 192.168.0.1
那么用户输入的没有错吧,可在数据库中 127.0.0.1 比 192.168.0.1
因为127.0.0.1 经过转换位正数,而另外的是负数,那么用原来的
'select * from table where fieldname >= IP (int,已经转换过的) and fieldname <= IP2' 这样不行吧,你在想想,最好写一下。
 
啊? 也许。。。我理解能力太差?

1.数据库不能改变,里面的IP字段存的是正数?负数?正负都有?

2.向数据库里存数据是你来存还是其他的程序,如果是其他的程序应该都是正或者都是负
如果是其他程序向数据库里存数据,而你也向数据库里存数据,那你应该和那些程序保持一致,全正或者全负

3.比较的时候,假设数据库里都是正数,那你直接用inet_addr(pchar(edit1.text))就可以,如果都是负数那就用ntohl转化一下再放到SQL语句里比较一下。。

如果数据库中已经存在有正有负的数据,那没办法,只好写个程序把数据库中的数据全部统一为正数或者负数,否则没法比较


怎么看都好象是很简单的东西。。。。也用不着变成12位的数字啊。。-_-!
难道我理解能力真的这么差?
 
不是的,每个人的解决方法不一样,也许你是对的,笨的是我呢?哈
 
哎~不管怎么样 能解决问题 效率不低就行了。。。。-_-!

越做项目越心烦。。。那些客户只看界面是不是漂亮,使用合不合习惯,至于你怎么实现的效率如何。。。他才懒的管,用最白痴效率最低的算法写出来和高效的算法写出来在客户眼里是一样的,价钱也不会变
 
现在能上QQ吗?你的BusinessSkinForm
能装吗?教一下,我还不会呢?我的号码为51393279
 
17948876 不能装?
 
Type Range Format
Smallint ?2768..32767 signed 16-bit
Longint ?147483648..2147483647 signed 32-bit
Int64 ?^63..2^63? signed 64-bit
Longword 0..4294967295 unsigned 32-bit

应该可以满足吧
 
var i:int64;
begin //202.103.179.106
i:=ip1*16777216+ip2*65536+ip3*256-1; //即使255.255.255.255得出的结果都不会大于10位数
end;
 
i:=ip1*16777216+ip2*65536+ip3*256-1; //即使255.255.255.255得出的结果都不会大于10位数

喂!楼上,既然是同一换算,为什么不固定乘以一个数,这样也可好比较呀
 
这个是通用的IP字符转整数的计算公式
 
后退
顶部