IP地址与DOWORD互转

2 篇文章 0 订阅
http://blog.sina.com.cn/s/blog_7d0544020100xjd7.html

#include <windows.h>

BOOL StrAddr2Dword(CHAR* lpStrAddr, DWORD* pdwAddr)
{
char* lpPos = lpStrAddr;  //指向当前操作的字符
int nNumCount = 0;  //数字的个数
int nPointCount = 0;  //分隔点的个数
BOOL bResult = FALSE;  //函数是否执行成功
DWORD dwAddr = 0;
DWORD Temp = 0;

//进行参数的有效性检查
if (!lpStrAddr || !pdwAddr)
{
return bResult;
}

while (*lpPos && nPointCount < 4)
{
if (nNumCount < 3)
{
if (*lpPos >= 0x30 &&  *lpPos <= 0x39)
{
bResult = TRUE;
dwAddr -= Temp;
Temp *= 10;
Temp += (*lpPos - 0x30);
if (Temp & ~0xFF)
{
break;  //从这里退出说明单个数超过了255,
}
dwAddr += Temp;
nNumCount++;
}
else if (*lpPos != '.')
{
break;  //从这里退出说明有非数字的字符
}
else
{
if (!nNumCount)
{
break;  //从这里退出说明单个数超过了255,或者是在一个分组中第个字符为点
}
else
{
bResult = FALSE;
Temp = 0;
dwAddr <<= 8;
nNumCount = 0;
nPointCount++;
}
}
}
else
{
if (*lpPos != '.')
{
break;  //单组数字字符超过了3个
}
else
{
bResult = FALSE;
Temp = 0;
dwAddr <<= 8;
nNumCount = 0;
nPointCount++;
}
}
lpPos++;
}

//凡是通过break跳出来的*lpPos肯定不为空。
//bResult为假说明点以后再没取到字符。
if (!(*lpPos) && nPointCount == 3 && bResult)
{
*pdwAddr = dwAddr;
}
else
{
bResult = FALSE;
}

return bResult;
}


BOOL DwordAddr2Str(DWORD dwAddr, CHAR* lpStrAddr)
{
DWORD Fmt = 0xFF << 24;  //该运算为常量运算编译器会做优化
DWORD Temp = 0;
CHAR Number = 0;
if (!lpStrAddr)
{
return FALSE;
}

for (int i = 3; i >= 0; i--)
{
Temp = dwAddr & Fmt;
Temp >>= 8*i;
Number = (BYTE)Temp/100;
if (Number != 0)
{
*lpStrAddr = Number + '0';
lpStrAddr++;
}

Number = ((BYTE)Temp/10) % 10;
if (Number != 0)
{
*lpStrAddr = Number + '0';
lpStrAddr++;
}

Number = (BYTE)Temp;
*lpStrAddr = Number + '0';
lpStrAddr++;

if (i > 0)
{
*lpStrAddr = '.';
lpStrAddr++;
}

Fmt >>= 8;
}

return TRUE;
}

//000.000.000.000是有效的IP
//0000.0000.0000.0000是无效的IP
//单组长度只支持到3位。
int _tmain(int argc, _TCHAR* argv[])
{
DWORD addr = 0;
static char Buffer[1024*1024];

do
{
printf("请输入一个字符串形式的IP地址进行计算:");
scanf("%s", Buffer);
if (StrAddr2Dword(Buffer, &addr))
{
printf("\r\n%s = X\r\n", Buffer, addr);
memset(Buffer, 0, sizeof(Buffer));
printf("再次转回去\r\n");
if (DwordAddr2Str(addr,Buffer))
{
printf("X = %s\r\n", addr, Buffer);
}
else
{
printf("转换失败!\r\n");
}
}
else
{
printf("\r\n%s是无效的IP地址!\r\n", Buffer);
}
} while (TRUE);
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值