1. 程式人生 > >IP地址格式轉換

IP地址格式轉換

先來講一個使用linux介面的將unsigned int型或者unsigned long等型別的資料轉化成點分十進位制的方法:
1.在/usr/include/arpa/inet.h檔案中有inet_ntoa()函式的宣告:
extern char *inet_ntoa(struct in_addr __in) __THROW;
__in:是struct in_addr的結構體變數.
那麼這個結構體變數是個什麼東西呢?我們來看看:
struct in_addr
{
    unsigned long s_addr;
};
所以,實際上,in_addr結構體就是個用來唬人的unsigned long型的變數.
OK,我們用程式碼來實現IP地址的轉換:
#include <stdio.h>
#include <arpa/inet.h>
#include <netinet/in.h>

int main()
{
    struct in_addr myaddr,testaddr;
    unsigned int addr_test = inet_addr("192.168.1.20");
    unsigned int ip = 1174448320;//隨意一個unsigned int 值,當然要確實是IP地址.
    //這個inet_addr()實際上就是將點分十進位制的IP地址轉化為unsigned int型的IP地址,和inet_ntoa(struct in_addr)是互逆的.
    memcpy(&myaddr,&addr_test,4);
    memcpy(&testaddr,&ip,4);
    printf("the ip is:%s/n",inet_ntoa(myaddr));
    printf("the ip is:%s/n",inet_ntoa(testaddr));
    return 0;
}
所以這是一種轉化IP地址格式的方法.
注意的一點:inet_ntoa(struct in_addr)介面中的返回值是定義的靜態變數.靜態分配的容易被覆蓋.


然後再來將一個自己寫的IP轉換的函式:表示健壯性,所以寫規範一點
struct ipaddr
{
    unsigned char ip1;
    unsinged char ip2;
    unsigned char ip3;
    unsigned char ip4;
}IPADDR;

int uint_to_ip(struct ipaddr *ipa,unsigned int ip)
{
    ipa->ip1 = 0;
    ipa->ip2 = 0;
    ipa->ip3 = 0;
    ipa->ip4 = 0;
    ip->ip1 = (ip>>0)&0xFF;
    ip->ip2 = (ip>>8)&0xFF;
    ip->ip3 = (ip>>16)&0xFF;
    ip->ip4 = (ip>>24)&0xFF;
}

然後寫個printf("%d.%d.%d.%d/n",ipa->ip1,ip->ip2,ip->ip3,ip->ip4);就OK了..
是不是覺得也很簡單一些...

Thanks.