Chinaunix首页 | 论坛 | 博客
  • 博客访问: 133456
  • 博文数量: 42
  • 博客积分: 2521
  • 博客等级: 少校
  • 技术积分: 440
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-31 21:29
文章分类

全部博文(42)

文章存档

2011年(1)

2010年(33)

2009年(8)

我的朋友

分类: C/C++

2010-08-20 10:18:36

今天遇到一个问题,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各分段的顺序不会颠倒。
 
 
阅读(2793) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~