1、十六进制的IP地址转换为点分十进制
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdint.h>
#include<arpa/inet.h>
int main(int argc, char**argv)
{
if (argc <= 1)
{
exit(0);
}
char* str = argv[1];
printf("%s %d %d %d\n", str, strlen(str), sizeof(str), atoi(str));
uint32_t tt ;
sscanf(str, "0x%x", &tt);
uint32_t t2 = htonl(tt);
struct in_addr inaddr;
inaddr.s_addr = t2;
char buf[128];
// 没问题
inet_ntop(AF_INET, &t2, buf, 128);
//也没问题
//inet_ntop(AF_INET, &inaddr, buf, 128);
printf("%s\n", buf);
}
编译;> g++ -o hex2dd hex2dd.c
运行:./hex2dd 0x8002c2f2
结果:128.2.194.242
2、点分十进制转换为十六进制输出
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdint.h>
#include<arpa/inet.h>
int main(int argc, char**argv)
{
if (argc <= 1)
{
exit(0);
}
char* str = argv[1];
struct in_addr inaddr;
inaddr.s_addr;
//没有做返回值判断
inet_pton(AF_INET, str , &inaddr);
printf("%x\n", ntohl(inaddr.s_addr));
}
编译;> g++ -o dd2hex dd2hex.c
运行:./dd2hex 128.2.194.242
结果:0x8002c2f2