在有的项目中会将IP地址用整型来表示,比如我现在这个项目,它用u_int32_t
来表示一个IPv4地址,需要将其转为我们常见的x.x.x.x
字符串形式。
IP
1
举个例子,比如有一个数1920103026
,它表示的是一个IP地址,如何转换为直观的形式呢。
先将其转为二进制形式1110010011100100111001001110010
,可以发现只有31位,而IP地址实际是有32位的,在最前面补一个0,然后分段,8位一段。
01110010 01110010 01110010 01110010
,将每一段再转为十进制,即
114 114 114 114
,可以看到转换后的IP地址是114.114.114.114
。
2
再举一个例子,1744939200
。
转为二进制
1101000000000011010100011000000
补0,分段
01101000 00000001 10101000 11000000
转为十进制
104 1 168 192
这时候发现这个地址其实是反的,为什么呢,我不想深究,反正就反过来就行了。
得到的IP地址就是192.168.1.104
,正好是我的虚拟机的IP。
大致就是这么个流程。
代码实现
主要用到了如下几个函数
- itoa(int val, char* buf):整型转为对应字符串,如
123->“123”
- convertDecToBin(uint32_t value,int bits,char *NumBit):十进制整型转为二进制字符串
- convertBinToDec(char * buf):二进制字符串转为十进制整型
- intToIP(uint32_t Num,char *IP):将整型转为IP地址
itoa(int val, char* buf)
int itoa(int val, char* buf)
{
const unsigned int radix = 10;
char* p;
unsigned int a; //every digit
int len;
char* b; //start of the digit char
char temp;
unsigned int u;
p = buf;
if (val < 0)
{
*p++ = '-';
val = 0 - val;
}
u = (unsigned int)val;
b = p;
do
{
a = u % radix;
u /= radix;
*p++ = a + '0';
} while (u > 0);
len = (int)(p - buf);
*p-- = 0;
//swap
do
{
temp = *p;
*p = *b;
*b = temp;
--p;
++b;
} while (b < p);
return len;
}
convertDecToBin(uint32_t value,int bits,char *NumBit)
void convertDecToBin(uint32_t value,int bits,char *NumBit)
{