【问题标题】:How to interpret the address converted from inet_pton?如何解释从inet_pton转换的地址?
【发布时间】:2023-03-24 18:59:01
【问题描述】:

当地址由inet_pton 函数转换为struct in_addr 时,我对从指定地址获得的值感到困惑。有这个:

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

int main(){
    char str[4];
    inet_pton(AF_INET, "1.2.3.4", (int*)str);
    printf("%i\n", *((int*)str));
}

我明白了

67305985

所以地址1.2.3.4 被转换为值67305985 的“网络地址”(inet_pton 的手册页),我不明白。我知道该函数将转换后的值保存为struct in_addr 的类型,但这基本上是一个int,所以我可以将它转换为int(我这样做了)并得到这个废话。那么我应该如何解释地址1.2.3.4中的值67305985

【问题讨论】:

    标签: c ip ip-address


    【解决方案1】:

    您得到的值是以小端字节顺序解释的字节值 1、2、3 和 4 的十进制表示。

    如果您单独打印每个字节,您会看到它们包含值 1、2、3 和 4。

    char str[4];
    int i;
    inet_pton(AF_INET, "1.2.3.4", (int*)str);
    for (i=0; i<4; i++) {
        printf("%d\n", str[i]);
    }
    

    输出:

    1
    2
    3
    4
    

    【讨论】:

    • 我不明白。 67305985 在什么编码中是顺序编号映射到顺序 1、2、3、4?既不是hexa也不是ascii,是什么?
    • 在十六进制中,67305985 是 04030201。inet_pton 函数将字节按网络字节顺序排列,即最高有效字节在前。当将它们解释为 int 时,字节会被反转,因为您的机器是 little-endian。
    • 我知道 little endian ,但为什么要85==0459==0330=0267==01?那是什么编码?
    • @milanHrabos 这不是 85==04、59==03、30=02、67==01。它是 67305985 == 04030201。你不能像这样匹配两个不同基数的数字。
    • @milanHrabos 您正在尝试逐位匹配十进制数和十六进制数。你不能那样做。如果你有 100 十进制/064 十六进制,你不会比较 1 == 0 和 00 == 64。67305985 十进制是 04030201 十六进制。该数字的字节按顺序存储为 01 02 03 04。当您将这些字节读取为 int 时,它会将第一个字节作为最低字节,将最后一个字节作为最高字节。
    猜你喜欢
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多