2014-10-07 49 views
0

我有一個in_addr結構與IP地址,我試圖從點十進制轉換爲二進制值。我真正需要做的,但不能做的工作,是一樣的東西C中的點分十進制到二進制

destn = inet_addr(inet_ntoa(addr)); 

其中addrin_addr_t變量。我知道,違反了語法,但是當我更仔細地遵循語法,我得到一個錯誤:

storage size of ‘addr’ isn’t known. 
+0

你的意思是在文本「11000000101010000000000000000001」或在32位無符號整數感意義上的二進制值? – Steve 2014-10-07 00:21:59

+0

對不起,應該指定 - 在32位無符號int的意義上。 – 2014-10-07 00:23:39

+0

什麼是'點分十進制'?舉例,編輯你的問題到可讀的形式,不要輸入隨機信息,它可能會關閉它 – chouaib 2014-10-07 00:40:52

回答

1

爲了將來的兼容性,您應該處理這兩個IP 4和6。否則,你可能已經INET_NTOA而不是提及inet_ntop。 (我的手機使用IP 6,所以如果我在手機上進行IP編程,我需要允許。)那麼,怎麼做?以下是我會開始:

char *address_string; 

(在address_string值填寫。)

struct in_addr addr4; 
int success4 = inet_pton(AF_INET, address_string, addr4); 
struct in6_addr addr6; 
int success6 = inet_pton(AF_INET6, address_string, addr6); 

你需要添加錯誤處理,當然。

如果你想獲得一個二進制IP號碼的文本表示相反,這應該做的工作:

struct in_addr addr4; 
struct in6_addr addr6; 
bool address_is_ip6; 

(填寫IP 4或6的地址的值,並注意哪些)

socklen_t ip6_maximum_length = 40; 
char address_string[ip6_maximum_length]; 
char *result = inet_ntop(address_is_ip6 ? AF_INET6 : AF_INET, address_is_ip6 ? &addr6 : &addr4, address_string, ip6_maximum_length); 

同樣,您需要錯誤處理。

+0

。他指出他已經有了一個帶有IP地址的'in_addr'結構,所以在這裏解析一個字符串似乎並不合適。 – 2014-10-07 00:49:47

+0

最初的問題有點不清楚,一方面提到起點是一個'in_addr'結構,並且意圖是「將點十進制轉換爲二進制值」。基於二進制值「在32位無符號整數意義上」回答我的澄清問題,我假定其目的是將文本轉換爲in_addr(或in6_addr)結構,並提供代碼那。 **爲什麼要投票?**無論如何,現在我已經提供了兩種轉換代碼。 – Steve 2014-10-07 06:11:06

2

如果你已經有了一個struct in_addr變量的IPv4地址,再有就是你需要做什麼:

/* Internet address. */ 
struct in_addr { 
    uint32_t  s_addr;  /* address in network byte order */ 
}; 

ip(7)。只需訪問s_addr字段,並且您的IPv4地址爲簡單的32位整數。

示例程序:

#include <stdio.h> 
#include <inttypes.h> 
#include <arpa/inet.h> 

int main(int argc, char *argv[]) 
{ 
    struct in_addr addr = {}; 
    const char *ip_str; 

    if (argc < 2) { 
     fprintf(stderr, "Usage: %s ip-addr\n", argv[0]); 
     return 1; 
    } 
    ip_str = argv[1]; 

    if (!inet_aton(ip_str, &addr)) { 
     fprintf(stderr, "Invalid IP address: %s\n", ip_str); 
     return 1; 
    } 

    printf("Address: 0x%08"PRIX32"\n", addr.s_addr); 
    // Just access the s_addr field --------^ 

    return 0; 
} 

用法示例:

$ gcc -Wall -Werror in.c 
$ ./a.out 192.168.7.4 
Address: 0x0407A8C0 
     ^^^^ 
      | | | \---- 192 
      | | \------ 168 
      | \-------- 7 
      \---------- 4 
+0

非常感謝幫助,@Jonathon Reinhart和@Steve! – 2014-10-07 08:34:39