在处理大量的IP地址时,尤其是在需要存储IP地址时,如果存储IP地址的点分十进制字符串,那么一个存储一个IP地址最少使用7字节(形如: x.x.x.x );最大需要使用15字节(形如: xxx.xxx.xxx.xxx )。同时如果是以字符串的形式存储IP地址,那么对这些数据的处理将是困难和低效的。比如,对这些IP的排序将是相当于对大量的字符串的排序,这无疑是一种低效的操作。
我们应当注意到一个事实,那就是在 TCP/IP V4中,所有的IP地址都可以用一个4字节的int值来表示,而IP地址的点分十进制字符串形式也是基于这个int值转换的。所以,在处理大量IP地址时,我们可以先将这些IP字符串转换为对应的int值,然后对这些ip地址的处理就相当于处理int值了,相对于字符串操作和存储都更高效。
下面提供一个函数将点分十进制的IP地址转换为对应的整数值:
#include <cstdio> //! @brief 将IP转换为数值 /*! 将点分十进制的IP转换为数值 @param[in] szIP ip地址字符串 @param[in,out] iIPValue 存储转换的数值 @return 如果调用成功,返回<b>true</b>;如果调用失败,返回<b>false</b>. */ bool IPtoNumber( const char *szIP , unsigned int &iIPValue ) { if ( NULL == szIP ) { return false; } int iFirst = 0; int iSecond = 0; int iThird = 0; int iFourth = 0; const int iStatus = sscanf( szIP , "%d.%d.%d.%d" , \ &iFirst , &iSecond , &iThird , &iFourth ); if ( 4 != iStatus ) { return false; } else { iIPValue = 0; iIPValue += iFirst * 0XFFFFFF; iIPValue += iSecond * 0XFFFF; iIPValue += iThird * 0XFF; iIPValue += iFourth; return true; } }
本站原创文章,转载请注明出处。
评论
发表评论 反向链接