我有一個in_addr
結構與IP地址,我試圖從點十進制轉換爲二進制值。我真正需要做的,但不能做的工作,是一樣的東西C中的點分十進制到二進制
destn = inet_addr(inet_ntoa(addr));
其中addr
是in_addr_t
變量。我知道,違反了語法,但是當我更仔細地遵循語法,我得到一個錯誤:
storage size of ‘addr’ isn’t known.
我有一個in_addr
結構與IP地址,我試圖從點十進制轉換爲二進制值。我真正需要做的,但不能做的工作,是一樣的東西C中的點分十進制到二進制
destn = inet_addr(inet_ntoa(addr));
其中addr
是in_addr_t
變量。我知道,違反了語法,但是當我更仔細地遵循語法,我得到一個錯誤:
storage size of ‘addr’ isn’t known.
爲了將來的兼容性,您應該處理這兩個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);
同樣,您需要錯誤處理。
。他指出他已經有了一個帶有IP地址的'in_addr'結構,所以在這裏解析一個字符串似乎並不合適。 – 2014-10-07 00:49:47
最初的問題有點不清楚,一方面提到起點是一個'in_addr'結構,並且意圖是「將點十進制轉換爲二進制值」。基於二進制值「在32位無符號整數意義上」回答我的澄清問題,我假定其目的是將文本轉換爲in_addr(或in6_addr)結構,並提供代碼那。 **爲什麼要投票?**無論如何,現在我已經提供了兩種轉換代碼。 – Steve 2014-10-07 06:11:06
如果你已經有了一個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
非常感謝幫助,@Jonathon Reinhart和@Steve! – 2014-10-07 08:34:39
你的意思是在文本「11000000101010000000000000000001」或在32位無符號整數感意義上的二進制值? – Steve 2014-10-07 00:21:59
對不起,應該指定 - 在32位無符號int的意義上。 – 2014-10-07 00:23:39
什麼是'點分十進制'?舉例,編輯你的問題到可讀的形式,不要輸入隨機信息,它可能會關閉它 – chouaib 2014-10-07 00:40:52