将4字节IP地址转换为标准点分十进制表示法

3
如果我有一个存储在 char address[4] 中的 4 字节地址,其内容为:
address[0] = '\x80';
address[1] = '\xAB';
address[2] = '\x0A';
address[3] = '\x1C';

// all together: 80 AB 0A 1C

我希望将其转换为一个字符数组,看起来像“128.171.10.28”,因为16进制中的80是128,AB是171,依此类推。
我该如何做到这一点?

“将一个4字节的十六进制IP地址转换为字符数组”是错误的问题 - 它已经是一个“字符数组”。你的意思是想要在标准点分十进制IP表示法中获得文本表示。因此,主题已相应更改。 - R.. GitHub STOP HELPING ICE
3个回答

9
char saddr[16];
sprintf(saddr, "%d.%d.%d.%d", (unsigned char)address[0], (unsigned char)address[1], (unsigned char)address[2], (unsigned char)address[3]);

或者

char saddr[16];
unsigned char *addr = (unsigned char*)address;

sprintf(saddr, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);

或者,正如dreamlax指出的那样:
char saddr[16];
sprintf(saddr, "%hhu.%hhu.%hhu.%hhu", address[0], address[1], address[2], address[3]);

"%hhu" 对于每个地址组件来说是更好的说明符,因为这正是您正在给出的sprintf - dreamlax
你的类型转换有误。在解引用指针之前,你需要将其强制转换为 unsigned char * 类型,而不是之后再进行转换。在之后进行转换会产生实现定义的行为,可能会引发信号或在非二进制补码系统上转换不正确。 - R.. GitHub STOP HELPING ICE
当然,最好一开始就使用正确的类型(unsigned char [4]uint8_t [4])。 - R.. GitHub STOP HELPING ICE

5
IP地址只是由十进制点分隔的单独八位字节。
  printf("%d.%d.%d.%d",address[0],address[1],address[2],address[3]);

你可能应该将你的char address[4]改为unsigned char address[4]


我不需要将其打印出来,但是我需要整个地址存储在另一个字符数组中,该数组包含字符{1,2,8,.,1,7,1,.,1,0,.,2,8}。 - MBU
这会为第一个字符给出"-128",除非你按建议更改数组类型为“unsigned char”。 - sje397
@MikeU:查找将字符串打印到变量中的函数。此外,字符串是char数组。 - Matt Ellen

-1

使用%u会更好。


使用gcc编译时出现了“stack smashing detected”错误。 - sje397
%u 应该只用于无符号数据 - 这个消息意味着 sprintf 缓冲区溢出,这可能意味着您的类型不一致。 - 0xDEADBEEF
Martin - 不是我的类型,但问题中所使用的类型。%u 期望 unsigned int 值。 - sje397

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接