C语言中的点十进制到二进制
我有一个C语言中的点十进制到二进制,c,linux,network-programming,C,Linux,Network Programming,我有一个in_addr结构,其中有一个IP地址,我正试图将其从点十进制转换为二进制值。我真正需要做的,但却无法工作,是这样的 destn = inet_addr(inet_ntoa(addr)); 其中,addr是\u addr\u t变量中的。我知道这违反了语法,但当我更仔细地遵循语法时,我会得到一个错误: “addr”的存储大小未知。 为了将来的兼容性,您应该同时处理IP 4和IP 6。否则,您可能会提到inet_ntoa而不是inet_ntop。(我的手机使用IP 6,所以如果我在手机上
in_addr
结构,其中有一个IP地址,我正试图将其从点十进制转换为二进制值。我真正需要做的,但却无法工作,是这样的
destn = inet_addr(inet_ntoa(addr));
其中,addr
是\u addr\u t变量中的。我知道这违反了语法,但当我更仔细地遵循语法时,我会得到一个错误:
“addr”的存储大小未知。
为了将来的兼容性,您应该同时处理IP 4和IP 6。否则,您可能会提到inet_ntoa而不是inet_ntop。(我的手机使用IP 6,所以如果我在手机上进行IP编程,我需要考虑它。)那么,如何实现呢?我是这样开始的:
char *address_string;
(填写地址字符串的值
)
当然,您需要添加错误处理
如果您试图获取二进制IP号的文本表示形式,则应执行以下操作:
struct in_addr addr4;
struct in6_addr addr6;
bool address_is_ip6;
(填写IP 4或6地址的值,并记下您使用的地址。)
同样,您需要错误处理。为了将来的兼容性,您应该同时处理IP 4和6。否则,您可能会提到inet_ntoa而不是inet_ntop。(我的手机使用IP 6,所以如果我在手机上进行IP编程,我需要考虑它。)那么,如何实现呢?我是这样开始的:
char *address_string;
(填写地址字符串的值
)
当然,您需要添加错误处理
如果您试图获取二进制IP号的文本表示形式,则应执行以下操作:
struct in_addr addr4;
struct in6_addr addr6;
bool address_is_ip6;
(填写IP 4或6地址的值,并记下您使用的地址。)
同样,您需要错误处理。为了将来的兼容性,您应该同时处理IP 4和6。否则,您可能会提到inet_ntoa而不是inet_ntop。(我的手机使用IP 6,所以如果我在手机上进行IP编程,我需要考虑它。)那么,如何实现呢?我是这样开始的:
char *address_string;
(填写地址字符串的值
)
当然,您需要添加错误处理
如果您试图获取二进制IP号的文本表示形式,则应执行以下操作:
struct in_addr addr4;
struct in6_addr addr6;
bool address_is_ip6;
(填写IP 4或6地址的值,并记下您使用的地址。)
同样,您需要错误处理。为了将来的兼容性,您应该同时处理IP 4和6。否则,您可能会提到inet_ntoa而不是inet_ntop。(我的手机使用IP 6,所以如果我在手机上进行IP编程,我需要考虑它。)那么,如何实现呢?我是这样开始的:
char *address_string;
(填写地址字符串的值
)
当然,您需要添加错误处理
如果您试图获取二进制IP号的文本表示形式,则应执行以下操作:
struct in_addr addr4;
struct in6_addr addr6;
bool address_is_ip6;
(填写IP 4或6地址的值,并记下您使用的地址。)
同样,您需要进行错误处理。如果您在\u addr变量中的
结构中已有IPv4地址,则无需执行任何操作:
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
看。只需访问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;
}
如果在_addr
变量中的结构中已经有IPv4地址,则无需执行任何操作:
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
看。只需访问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;
}
如果在_addr
变量中的结构中已经有IPv4地址,则无需执行任何操作:
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
看。只需访问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;
}
如果在_addr
变量中的结构中已经有IPv4地址,则无需执行任何操作:
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
看。只需访问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;
}
您是指文本“110000000101010000000000000000001”意义上的二进制值还是32位无符号整数意义上的二进制值?对不起,应该指定--在32位无符号整数意义上。什么是点十进制?举个例子,将你的问题编辑成可读的形式,不要输入随机信息,它可能会得到它closed@chouaib是表示IP地址的标准形式。仅仅因为你不知道某件事并不意味着它是“随机信息”。在让OP修改他的问题之前,请先进行研究。@s_frank“点十进制”只是文本表示IPv4地址的一种方式。32位十六进制值是另一个,由1和0组成的字符串是另一个。如果您在_addr
结构中有一个,那么您已经在内存中获得了“二进制”形式的值。你下一步要用这个值实现什么?打印出来?我认为您需要显示更多的代码。这个问题现在无法回答。你是指文本“110000000101010000000000000000001”意义上的二进制值还是32位无符号整数意义上的二进制值?对不起,应该指定--在32位无符号整数意义上。什么是点十进制
?举个例子,将你的问题编辑成可读的形式,不要输入随机信息,它可能会得到它closed@chouaib是表示IP地址的标准形式。仅仅因为你不知道某件事并不意味着它是“随机信息”。在让OP修改他的问题之前,请先进行研究。@s_frank“点十进制”只是文本表示IPv4地址的一种方式。32位十六进制值是另一个,由1和0组成的字符串是另一个。如果您在_addr结构中有一个,那么您已经在内存中获得了“二进制”形式的值。你下一步要用这个值实现什么?打印出来?我认为您需要显示更多的代码。这个问题现在无法回答。你是指文本“110000000101010000000000000000001”意义上的二进制值还是32位无符号整数意义上的二进制值?对不起,sho