如何将整数数组转换为C++中的IP地址?

问题描述:

我有一个数组ipAddress [4],有4个整数值,例如127,0,0,1,我需要将它转换为字符串“127.0.0.1”。如何将整数数组转换为C++中的IP地址?

我该怎么做?

编辑:只是为了澄清,我稍后需要这个来比较一个函数的输入。我不想在屏幕上打印出来。

+3

为什么你要找一些复杂的解决方案而不是简单的' Ven

+0

我稍后需要它与来自函数的输入进行比较。我不想打印它。 – Anantmurti

+0

字符串也有'+' – Ven

一种方法是:

char buf[16]; 
snprintf(buf, sizeof buf, "%d.%d.%d.%d", 
    ipAddress[0], ipAddress[1], ipAddress[2], ipAddress[3]); 

就我个人而言,我发现这比10线解决方案涉及循环和多个函数调用更优雅,其他人会不同意!

+0

看起来更清洁,然后其他solutions.Upvote! – Avdept

+1

注意编辑器:回滚,OP没有说他的数组是'uint8_t' –

+0

@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 << '.'; 
} 

Example

您可以随时使用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; 
} 

这将解决您的问题

+0

@ M.M那么,在他的例子中,127.0.0.1.'末尾有'.',这是误导。现在它是固定的。但我仍然不明白为什么我得到了-1! – KostasRim

+1

可能得到-1,而答案是错误的,并且该人没有重新访问。我希望当你投票的东西被编辑时,他们会添加一个选项来通知 –

+0

@ M.M我只是认为他想在'127.0.0.1'末尾加'.'。当有人倒退时,他至少可以提供一些解释。顺便说一句,该选项将是伟大的! – KostasRim

如果要转换使用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; 
} 

Test

编辑:主要的帖子被编辑,但原表示,他尝试使用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; 
}