IP地址格式转换

通过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中。

发布了314 篇原创文章 · 获赞 206 · 访问量 61万+

猜你喜欢

转载自blog.csdn.net/hou09tian/article/details/102599271
今日推荐