|------------|-----------------|
| 十六进制地址 | 点分十进制地址 |
| 0x0 | 0.0.0.0 |
| 0xffffffff | 255.255.255.255 |
| 0x7f000001 | 127.0.0.1 |
[表1 把十六进制地址变为点分十进制地址]
程序如下
cpp
#include <stdio.h>
char str[16]={'\0'}; // 存放点分十进制串
struct in_addr {
unsigned int s_addr;
};
char *inet_ntoa(struct in_addr in); // 函数声明
int main()
{
struct in_addr addr0;
char *s;
addr0.s_addr=0x8002c2f2; // 存放IP地址
s=inet_ntoa(addr0);
printf("%s",s);
return 0;
}
char *inet_ntoa(struct in_addr in)
{
unsigned int x,temp;
unsigned int mask=0xff000000; // 掩码
char i,j,k=0,m,n,t;
char *tp;
x = in.s_addr;
j=3;i=0;m=i;
for(j=3;j>=0;j--)
{
temp = x & mask; // 字节IP值
temp = temp>>(j*8); // 移动到最低字节
mask>>=8; // 掩码右移1字节
do // 10进制数从低位到高位的ASCII码保存在数组str中
{
str[i]=temp%10+'0';
temp=temp/10;
i++;
}while(temp);
if(k<3) // 前3个数字串用.字符分隔
{
str[i]='.';
k++;
}
for(n=i-1; m<n; m++,n--) // 每个数字串逆序存放
{
t=str[m];
str[m]=str[n];
str[n]=t;
}
i++;
m=i; // m存放数字串第1个字符的位置编号
}
tp=str; // 数组首地址送指针tp
return tp;
}
运行结果:
128.2.194.242