强制性转换的简单问题 但我就是不懂!!!麻烦大家了!!!
/****************************************************
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
.......
似乎太罗嗦了,就不说了,估计你已经明白了:)。