请问整数和IP地址之间如何转换?(有负整数)(100分)

  • 主题发起人 主题发起人 cozo
  • 开始时间 开始时间
C

cozo

Unregistered / Unconfirmed
GUEST, unregistred user!
我们公司采用sygate和wingate做网关出口,并且对每个客户端统计流量。wingate的流量记录在很多个log文件中,
都是些文本文件,每隔几行有一行是记录流量的数字的,其他行净是些目标地址之类的没用的东西,
虽然麻烦,但是也可以统计出来。
sygate用的是access数据库,直接写入每个请示的数据量,按理说应该比wingate方便多了。
但是它写入数据库的local ip字体用的是整形,而且其中有几个负数,怎样才能把这些整数转换成IP地址呢?
注:公司内网IP用的是192.168.0.*的形式,数字的倍数有十位的也有8位的。还有负的。
 
uses WinSock;

procedure TForm1.Button1Click(Sender: TObject);
var
iad: TInAddr;
begin
iad.S_addr := ntohl($c0a80101); //假设数字是$c0a80101,这里用十六进制表示只是为了显示方便。
caption := inet_ntoa(iad);
end;
 
function TCusBlockTcp.IpIntToIpStr(IP: Integer): string;
//将int类型表示的IP地址转换为带'.'的字符串
var
Addr: in_addr;
begin
Addr.S_addr := IP;
Result := inet_ntoa(Addr);
end;

注意先要初始化sock
if not WSAStartup(MakeWord(2, 0), WsData) = 0 then //初始化winsock
begin
//初始化错误
end;
最后要释放
WSACleanup; //释放Winsock

不过不知道是不是符合你的要求?
 
果然好用,不过又出现了一个问题,我把数据库中的数值放进去之后,出来的字符串IP是倒着的。
比如我的数据库的数字是-33445696,显示的IP是254.1.168.192。请问这是为什么?能不能让它正确的显示出来?
 
噢,明白了,是那个ntohl搞的,去掉它就可以了,这个函数是做什么用的?
另外,我没有初始化的代码似乎也没有问题啊?怎么回事?
 
这个函数就是将int类型的IP地址转换为字符串型式的IP地址啊。
哦,这个函数的确不需要初始化winsock。但是有很多函数是必需初始化winsock的,否则得
不到正确值。
 
Ip地址的表示是32位的二进制数,为方便分为4组8位。2的8次方=256
255。1。168。192 ->11111111.0000001.10101000.11000000
integer正好为32位
转换如下: integer-ip:
function intToIp(i:integer):string;
var
b:byte;
begin
result:=
inttostr(-33445696 shr 24 and $000000FF )+'.'
+ inttostr(-33445696 shr 16 and $000000FF )+'.'
+ inttostr(-33445696 shr 8 and $000000FF )+'.'
+ inttostr( -33445696 and $000000FF) +'.'
);
end
 

Similar threads

回复
0
查看
848
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部