我想将一串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;
}
答案 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;
}