今天遇到一个问题,ip地址存放在32位的int变量内,希望一点分的方式打印出来。于是决定自己写个小的函数来干这件事情。
void print_ip_from_uint(int ip)
{
unsigned char *p = (unsigned char *)&ip; //注意p一定要定义为unsigned char
int i;
for(i = 4; i > 0; i--) //从高地址 还是低地址 开始输出
printf("%d.", *(p + i - 1)); //取决于你机器是大端还是小端(这里是小端)
//这里隐含一个char到int的转换
printf("\b \n");
}
main()
{
int ip = 0xff 0f 10 04;
print_ip_from_uint(ip);
}
输出:255.15.16.4
在这个函数起初想很简单,但这里却有两个小的陷阱:
1.char和int之间的转换方式:(char:1个字节,int:4个字节)
A.如果char是signed的,那么 int 最低字节以 char 内容填充,而剩下3个高字节以该signed char的符号位(最高位)进行置位,即符号扩展。例如:char 为0xf0, 转换为int 0xff ff ff f0 在进行打印时便得不到我们想要的结果。这里,我们希望得到的是 int 0x00 00 00 f0
B.如果char是unsigned的那么,那么 int 最低字节以 char 内容填充, 其余3个搞字节全部置零。而这种转换方式正是这里需要的。
将char取为unsigned char还是signed char是平台相关的,x86默认为signed。
2.大端小端的问题:打印时需要确定你的平台是大端还是小端,确保输出时ip各分段的顺序不会颠倒。
阅读(2842) | 评论(0) | 转发(0) |