如何将整数数组转换为C++中的IP地址?
我有一个数组ipAddress [4],有4个整数值,例如127,0,0,1,我需要将它转换为字符串“127.0.0.1”。如何将整数数组转换为C++中的IP地址?
我该怎么做?
编辑:只是为了澄清,我稍后需要这个来比较一个函数的输入。我不想在屏幕上打印出来。
一种方法是:
char buf[16];
snprintf(buf, sizeof buf, "%d.%d.%d.%d",
ipAddress[0], ipAddress[1], ipAddress[2], ipAddress[3]);
就我个人而言,我发现这比10线解决方案涉及循环和多个函数调用更优雅,其他人会不同意!
看起来更清洁,然后其他solutions.Upvote! – Avdept
注意编辑器:回滚,OP没有说他的数组是'uint8_t' –
@M。M确实,但IPv4地址八位组是按设计无符号8位值的,所以其他任何东西都没有意义 –
刚刚推出自己通过数组循环和增加地方所需要的整数:
constexpr int ipvals[] = {127, 0, 0, 1};
constexpr size_t size_vals = sizeof(ipvals)/sizeof(*ipvals);
std::ostringstream ss;
for(int i = 0; i < size_vals; ++i)
{
ss << ipvals[i];
if(i != size_vals - 1)
ss << '.';
}
您可以随时使用to_string()
方法:
#include<string>
#include<iostream>
using namespace std;
int main() {
string s;
int ipAddress[] = {127, 0, 0, 1};
for(int i = 0; i < 4; ++i) {
s += to_string(ipAddress[i]);
if(i != 4 - 1)
s += '.';
}
cout << s << endl;
}
这将解决您的问题
如果要转换使用inet_ntoa()
正如你所说,你可以做到这一点:
int main() {
struct in_addr addr;
char* some_addr;
int ipAddress[] = {127,0,0,1};
addr.s_addr = (ipAddress[3] << 24) | (ipAddress[2] << 16) | (ipAddress[1] << 8) | ipAddress[0];
some_addr = inet_ntoa(addr);
printf("%s\n", some_addr);
return 0;
}
编辑:主要的帖子被编辑,但原表示,他尝试使用inet_ntoa()
这方法。
编辑M.M的答案,使C/C++函数专用于IPv4地址;强制使用有效地址输入和缓冲区长度输出:
bool ipv4_addr_to_str(uint8_t (*ipv4_addr)[4], char (*str)[16])
{
bool success = false;
if (ipv4_addr != NULL && str != NULL)
{
memset(*str, 0, 16);
snprintf(*str, sizeof(*str), "%d.%d.%d.%d",
(*ipv4_addr)[0], (*ipv4_addr)[1], (*ipv4_addr)[2], (*ipv4_addr)[3]);
success = true;
}
return success;
}
为什么你要找一些复杂的解决方案而不是简单的' Ven
我稍后需要它与来自函数的输入进行比较。我不想打印它。 – Anantmurti
字符串也有'+' – Ven