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

时间:2015-03-28 04:08:53

标签: 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;
}

1 个答案:

答案 0 :(得分:3)

您的主机字节顺序和网络字节顺序不匹配。当您调用inet_aton时,地址以网络字节顺序存储在内存中。当您使用printf格式说明符调用%x时,它会使用主机字节顺序打印相同的内存区域。如果您在打印地址之前致电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;
}