c - 为什么 inet_aton 返回的十六进制数是倒序的?

标签 c

我想将一串IP地址转换成对应的十六进制数。下面是这样做的程序,但我得到了倒数。例如,如果字符串为 128.2.194.242,则结果为 f2c20280。当我尝试使用 inet_ntoa 从十六进制字符串转换为 IP 时,也会发生同样的事情。程序有什么问题?

int main(int argc, char *argv[]){
    struct in_addr in;

    if((inet_aton(argv[1], &in)) == 0)
        error("inet_ntoa");

    printf("hex: %x", in.s_addr);

    return 0;
}

最佳答案

您的主机字节顺序和网络字节顺序不匹配。当您调用 inet_aton 时,地址以网络字节顺序存储在内存中。当您使用 %x 格式说明符调用 printf 时,它会使用主机字节顺序打印相同的内存区域。如果调用 ntohl,它将 long 从网络字节顺序转换为主机字节顺序,在打印地址之前,您将看到地址以“正确”顺序打印:

int main(int argc, char *argv[]){
    struct in_addr in;

    if((inet_aton(argv[1], &in)) == 0)
        error("inet_ntoa");

    printf("hex: %x", ntohl(in.s_addr));

    return 0;
}

关于c - 为什么 inet_aton 返回的十六进制数是倒序的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29313573/

相关文章:

c - 在 Windows x64 上访问 char** 的内容会导致异常

c - 目标文件中的函数和参数不正确?

c++ - 如何使用 fork() 创建进程链?

c - C语言循环6位

c - 如何读/写 block 设备?

c - 获取给定路径的目录和目录,如果没有给出路径,则使用当前工作目录

c - 从输入文件扫描时 Scanf 忽略换行符

c++ - 从共享库和加密 key 中剥离符号

将用户输入连接到 C 中的字符串

c - 关于linux中匿名映射内存的问题