在处理大量的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;
    }
}

本站原创文章,转载请注明出处。