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