通过RtlIpv4StringToAddressA()和RtlIpv4AddressToStringA()函数可以实现in_addr格式的IP地址与字符串格式的IP地址之间的互换。
1 RtlIpv4StringToAddressA()函数
1.1函数格式
该函数的作用是将字符串格式的IP地址转换为in_addr结构的IP地址。该函数的格式为
NTSYSAPI NTSTATUS RtlIpv4StringToAddressA(
PCSTR S
, BOOLEAN Strict
, PCSTR *Terminator
, in_addr *Addr
);
其中,参数s是包含了要转化的IP地址的字符串;Strict值如果是TURE,则参数s必须是标准的十进制“XXX.XXX.XXX.XXX”格式,否则标准格式不是必须的;Terminator是一个字符的指针,该字符用于s的结束符,通过Terminator可以在s中提取更多的信息;Addr是in_addr的指针,该指针指向转换后的IP地址。如果函数成功执行,则返回STATUS_SUCCESS,否则返回STATUS_INVALID_PARAMETER等值。
1.2 函数说明
对于RtlIpv4StringToAddressA()函数,有以下几点说明:
1.2.1 相关头文件
RtlIpv4StringToAddressA()函数所需的头文件是ip2string.h,库文件是Ntdll.dll和Ntdll.lib。在使用RtlIpv4StringToAddressA()函数时,不需要Windows套接字的头文件和库文件。
1.2.2 参数Strict
在“1.1函数格式”中提到,RtlIpv4StringToAddressA()函数的参数Strict的值是TRUE时,参数s的格式必须是十进制的“XXX.XXX.XXX.XXX”格式,而当XXX的值不在0-255的范围之内时,RtlIpv4StringToAddressA()函数的返回值是STATUS_INVALID_PARAMETER。当Strict的值是FALSE时,参数的s格式可以是“XXX.XXX.XXX”、“XXX.XXX”或者“XXX”。
1.2.3 参数Terminator
在“1.1函数格式”中提到,RtlIpv4StringToAddressA()函数Terminator指向一个表示s结束的字符。通过指定该字符,可以将“IP地址+Terminator+其它信息”格式的信息进行提取。
1.3 相关函数
通过以下代码使用RtlIpv4StringToAddressA()函数实现IP地址格式的转换。
PCSTR Terminator = "";
in_addr Addr;
if (RtlIpv4StringToAddressA(argv[1], false, &Terminator, &Addr) == STATUS_INVALID_PARAMETER)
{
printf("参数错误!");
return 0;
}
其中,argv[1]是输入的要进行转换的IP地址,转换后的IP地址保存在变量Addr中。
2 RtlIpv4AddressToStringA函数
2.1函数格式
该函数的作用是将in_addr结构的IP地址转换为字符串格式的IP地址。RtlIpv4AddressToStringA函数的格式为
NTSYSAPI PSTR RtlIpv4AddressToStringA( const in_addr *Addr, PSTR S );
其中,参数Addr是要转换的IP地址,S是字符串的指针,该字符串用于保存转换之后的IP地址。RtlIpv4AddressToStringA函数的返回值是参数Addr中表示IP地址的字符串之后的一个字符,该字符可以看作是IP地址和其它附加信息的“分隔符”。通过确定这个“分隔符”,可以在参数Addr中加入除IP地址之外的附加信息。
2.2 相关代码
char addr[30] = { 0 };
RtlIpv4AddressToStringA(&Addr, addr);
其中,Addr是“1.3 相关函数”中经过RtlIpv4StringToAddressA()函数转换后的地址,其格式为in_addr;转换后的字符串格式的IP地址保存在参数addr中。