IP地址和Int數據的轉換


IP地址在很多嵌入式系統中都會存儲為一個32位的int數,因為它每一段都恰好可以用4組8位二進制表示,如果用字符串表示會浪費空間。

這就涉及到了IP地址和int數的互相轉換,其實原理相當簡單,如下:

IP:192.168.1.1

1 拆分:【192】【168】【1】【1】

2 每段都變為8位的二進制:【11000000】【10101000】【00000001】【00000001】

3 合成一個數:11000000101010000000000100000001=3232235777

組合成一個數最簡單的方式就是用移位和或運算:

用p1 p2 p3 p4代替ip四段數據

p1<<(3*8) 第一段左移3個8位即24位

p2<<(2*8)第二段左移16位

p3<<8     第三段左移8位

p4不變

移位后數據后面都填充0,四段數據相加其實就是或,所以p1|p2|p3|p4后就是ip地址轉換成的整數

 

把整數轉換成ip的過程正好是反過來:

1 p1=value&0xff000000//取第一段8位數

2 p1>>(3*8)//右移去掉后面的0,變成正確的整數

    p2 = (value & 0x00ff0000)>>(2*8);
    
    p3 = (value & 0x0000ff00)>>(8);
    
    p4 = (value & 0x000000ff);

3 然后把每段都變成字符串連接起來,中間添加分隔符[.]就成了ip地址。

 

example:

 

 1 void IP2Int(char* ip)
 2 {
 3     unsigned int intip= 0;
 4     unsigned char p1=0;
 5     unsigned char p2 =0;
 6     unsigned char p3 =0;
 7     unsigned char p4 =0;
 8     
 9     char* tmp=NULL;
10     
11     tmp = strtok(ip,".");
12     p1 = atoi(tmp);
13     
14     tmp = strtok(NULL,".");
15     p2 = atoi(tmp);
16     
17     tmp = strtok(NULL,".");
18     p3 = atoi(tmp);
19     
20     tmp = strtok(NULL,".");
21     p4 = atoi(tmp);
22     
23     intip = (p1<<(3*8)) | (p2<<(2*8)) | (p3<<8) | p4;
24 }
25 
26 void Int2IP(unsigned int value)
27 {
28     char ip[16]= {0};
29     unsigned char p1=0;
30     unsigned char p2 =0;
31     unsigned char p3 =0;
32     unsigned char p4 =0;
33 
34     p1 = (value & 0xff000000)>>(3*8);
35     
36     p2 = (value & 0x00ff0000)>>(2*8);
37     
38     p3 = (value & 0x0000ff00)>>(8);
39     
40     p4 = (value & 0x000000ff);
41 
42     snprintf(ip,sizeof(ip),"%d.%d.%d.%d",p1,p2,p3,p4);
43 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM