我有一个十六进制值说,例如0x0a010203,我想把它转换成一个字符串,转换后,它应该像“10.1.2.3“,如何提取的十六进制值的各个领域?
lnxxn5zx1#
填写一个struct in_addr并使用inet_ntoa()(“Internet地址到ASCII字符串”):
struct in_addr
inet_ntoa()
#include <arpa/inet.h> struct in_addr addr; addr.s_addr = htonl(0x0a010203); // s_addr must be in network byte order char *s = inet_ntoa(addr); // --> "10.1.2.3"
请注意,inet_ntoa()返回的字符串可能指向静态数据,这些数据可能会被后续调用覆盖。这是没有问题的,如果它只是打印,然后不再使用。否则,需要 * 复制 * 字符串。
t30tvxxf2#
您可以使用位掩码和位移位,例如:
unsigned int val = 0x0a010203; printf("%d.%d.%d.%d", (val & 0xFF000000) >> 24, (val & 0x00FF0000) >> 16, (val & 0x0000FF00) >> 8, val & 0x000000FF);
lokaqttq3#
unsigned ip = 0x0A0A0A50; printf("%u.%u.%u.%u\n",ip >> 24 & 0xFF ,ip >> 16 & 0xFF ,ip >> 8 & 0xFF ,ip & 0xFF); Output: 10.10.10.80
3条答案
按热度按时间lnxxn5zx1#
填写一个
struct in_addr
并使用inet_ntoa()
(“Internet地址到ASCII字符串”):请注意,
inet_ntoa()
返回的字符串可能指向静态数据,这些数据可能会被后续调用覆盖。这是没有问题的,如果它只是打印,然后不再使用。否则,需要 * 复制 * 字符串。t30tvxxf2#
您可以使用位掩码和位移位,例如:
lokaqttq3#