IP地址库中IP地址的保存格式一般有两种,一种是点分十进制形式(192.168.1.1),另一种是数字形式(3232235777)。应用中,经常需要在这两种格式之间做转换。
那么,如何将点分十进制的IP地址转为数字?
IPv4 地址有4个字节,样式如下:
MSB————–LSB
b4 b3 b2 b1
每个字节表示的范围:
- BYTE4: 4294967296(2*32*)
- BYTE3: 16777216(2*24*)
- BYTE2: 65536(2*16*)
- BYTE1: 256(2*8*)
通用公式:
b4*BYTE3+ b3*BYTE2 + b2*BYTE1 + b1
例如,222.173.108.86
转换方法:
222* BYTE3 + 173* BYTE2 + 108* BYTE1 + 86 =>3735907414
再例如,1.0.1.1
转换方法:
1* BYTE3 + 0* BYTE2 + 1* BYTE1 + 1 =>16777473
简单写一个转换小工具,代码如下:
#include <stdio.h>
#include <stdlib.h>
#define BYT_24 (16777216L)
#define BYT_16 (65536L)
#define BYT_8 (256)
int main(int argc, char* argv[])
{
if (argc < 5)
{
printf("Usage: ip_str2dgt addr4 addr3 addr2 addr1 \neg. ip_str2dgt 192 168 1 1\n");
return -1;
}
int addr4 = atoi(argv[1]);
int addr3 = atoi(argv[2]);
int addr2 = atoi(argv[3]);
int addr1 = atoi(argv[4]);
printf("addr4:%d, addr3:%d, addr2:%d, addr1:%d\n", addr4, addr3, addr2, addr1);
long result = addr4*BYT_24 + addr3*BYT_16 + addr2*BYT_8 + addr1;
printf("The result is %ld\n", result);
return 0;
}
$ gcc ip_str2dgt.c -o ip_str2dgt
$ ip_str2dgt 192 168 1 1
The result is 3232235777