当前位置:  技术问答>linux和unix

强制性转换的简单问题 但我就是不懂!!!麻烦大家了!!!

    来源: 互联网  发布时间:2016-02-29

    本文导语:  /****************************************************    inet_ntoa ---------------------------------------------------- Converts a IP address repersented in a 32 bit unsigned int into a string ****************************************************/ //1将32位的无符...

/****************************************************

   inet_ntoa
----------------------------------------------------
Converts a IP address repersented in a 32 bit
unsigned int into a string
****************************************************/ //1将32位的无符号整型IP地址转换为字符串
char *inet_ntoa(__u32 ina) //1不懂!!!
{
    static char buf[4*sizeof "123"];
    unsigned char *ucp = (unsigned char *)&ina; //1把IP地址的值的地址从整型转换成字符型指针
    sprintf(buf, "%d.%d.%d.%d", ////把地址设置为XXX.XXX.XXX.XXX的形式
            ucp[0] & 0xff, //四个字段,每个字段与上FF,确保数据正确,ucp[0]表示前3位,
            ucp[1] & 0xff, //ucp[1]表示接下来的3位,依此类推都"打印"到buf里
            ucp[2] & 0xff,
            ucp[3] & 0xff);
    return buf;
}


其中  字符型指针ucp[0]-[3]到底有几个字符? 
从buf的定义来看 是个16个字符的字符数组吧
由于%d后有个"."那么%d应该是3个字符吧
那为什么unsigned char *ucp = (unsigned char *)&ina;后
ucp指向ina,这样的话,
ucp[0]-[3]每一个只代表3个字符??应该有4个字符啊!! 
这样的话那buf就应该有20个字符了!!!

到底是怎样的啊!!麻烦大家了!!

|
> ucp[0]-[3]每一个只代表3个字符??应该有4个字符啊!! 
为何这么想?

一个字节的数据换算成10进制最多只有三位,因为最大是255,所以

一个32位整数是四个字节,每个字节转换成一个char,正好放在ucp里面。
举个例子你就明白了,192.168.1.1这个地址存成整数,那么整数的四个字节里面分别存的是(假定字节顺序是我这样):
192, 168, 1, 1
换成16进制是:
0xc0, 0xa8, 0x01, 0x01
那么,
ucp[0] = 0xc0
ucp[1] = 0xa8
ucp[2] = 0x01
ucp[3] = 0x01

.......

似乎太罗嗦了,就不说了,估计你已经明白了:)。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3