C ++将Uint32 IP地址转换为文本x.x.x.x.

时间:2011-01-17 18:16:41

标签: c++

我想将Uint32 IP地址转换为连接字符串。

在这个过程中我得到了uint8数据,但我需要将其更改为const char *,以便能够将其连接到IP的其他部分,以便能够在一个变量中打印完整的IP。

如何将uint 8更改为const char *?或者是否有更好的方法来进行所有转换过程?

uint32 ipAddress = GetHostIp();
if (ipAddress)
 {
    const int NBYTES = 4;
        uint8 octet[NBYTES];
        int x;
        char *ipAddressFinal;
        for (x = 0; x < NBYTES; x++)
        {
             octet[x] = (ipAddress >> (x * 8)) & (uint8)-1;
        }
        for (x = NBYTES - 1; x >= 0; --x)
        {
            if (NBYTES==4)
                        {
                            const char *IPPart = octet[x]; // HERE IS THE BUG!!!!! ?
                strcpy(ipAddressFinal, IPPart);
                        }
            else
                        {
                            const char *IPPart = octet[x];  // HERE IS THE BUG!!!!! ?
                strcat(ipAddressFinal, IPPart);
                        }
            if (x > 0)
                strcat(ipAddressFinal, ".");
        }
     LogAlways("IP:   %s", ipAddressFinal);
 }

修改

谢谢你们 - 问题解决了!谢谢大家!在短暂的等待时间内获得非常好的答案真是太棒了!特别感谢Lacrymology!这里现在是工作代码,我不使用Linux我应该写下我的操作系统等...

if (ipAddress)
{
    const int NBYTES = 4;
    uint8 octet[NBYTES];
    char ipAddressFinal[16];
    for(int i = 0 ; i < NBYTES ; i++)
    {
        octet[i] = ipAddress >> (i * 8);
    }
    sprintf(ipAddressFinal, "%d.%d.%d.%d", octet[3], octet[2], octet[1], octet[0]);
    LogAlways("IP:   \"%s\"", ipAddressFinal);
}

6 个答案:

答案 0 :(得分:4)

猜测你正在使用Linux - gethostip()似乎出现在Linux手册页中。无论如何,如果是这种情况,那么使用inet_ntoa()呢?

sprintf(ip_src, "%s", inet_ntoa(ipdata->ip_src));

假设char* ip_src有足够的空间来容纳IP地址,当然。旨在将struct in_addr转换为char*

包括:#include <arpa/inet.h>

答案 1 :(得分:4)

如何

uint32 ipAddress = GetHostIp();
if (ipAddress) {
    char ipAddr[16];
    snprintf(ipAddr,sizeof ipAddr,"%u.%u.%u.%u" ,(ipAddress & 0xff000000) >> 24 
                                                ,(ipAddress & 0x00ff0000) >> 16
                                                ,(ipAddress & 0x0000ff00) >> 8
                                                ,(ipAddress & 0x000000ff));
    // depending on the byte order your GetHostIp() returns the IP address in
    // you might need to reverse the above (i.e. print (ipAddress &0x000000ff)) first.
    LogAlways("IP:   %s", ipAddr);
}

您也可以使用inet_ntoagetnameinfo将IP地址转换为字符串。

答案 2 :(得分:2)

首先,你标记为“HERE is the BUG”的行应该像sprintf(“%d”,octet [x]);但我会告诉你我认为更好的解决方案(绝不是最好的)

uint32 ipAddress = GetHostIp();
if (ipAddress)
{
    const int NBYTES = 4;
    uint8 octet[NBYTES];
    int x;
    char *ipAddressFinal[16];
    for(int i = 0 ; i < NBYTES ; i++)
    {
        octet[i] = ipAddress >> (i * 8);
    }
    sprintf("%d.%d.%d.%d", octet[0], octet[1], octet[2], octet[3]);
}

现在,这是“错误的”,因为我假设IP地址中有4个字节,但它完成了这项工作。同样假设,你可以改变for循环

if (ipAddress)
{
   union {
       uint32 raw;
       uint8 octet[4];
   } ip;
   ip.raw = ipAddress;
   sprintf("%d.%d.%d.%d", ipAddressFinal, ip.octet[0], ip.octet[1],
                                          ip.octet[2], ip.octet[3]);
}

如果您不想假设那里有4,那么您必须坚持第一种方式并做类似的事情

sprintf("%s.%d", ipAddressFinal, , ipAddressFinal, ip.octet[i]);

我不知道是否有效,因为它具有相同的字符串输入和输出

答案 3 :(得分:0)

为什么不只是inet_ntoa(*(struct in_addr *)&uint32var)?正如https://stackoverflow.com/a/9961072/93647

所建议的那样

答案 4 :(得分:0)

这是一个真正的C ++解决方案

  #include <arpa/inet.h>

  std::string GetIPString(uint32_t x) const
  {
      char buffer[INET_ADDRSTRLEN + 1];
      auto result = inet_ntop(AF_INET, &x, buffer, sizeof(buffer));
      if (result == nullptr) throw std::runtime_error("Can't convert IP4 address");
      return buffer;
  }

答案 5 :(得分:-1)

谢谢你们 - 问题解决了!谢谢大家!在短暂的等待时间内获得非常好的答案真是太棒了!特别感谢Lacrymology!这里现在是工作代码,我不使用Linux我应该写下我的操作系统等...

if(ipAddress) {     const int NBYTES = 4;     uint8 octet [NBYTES];     char ipAddressFinal [15];     for(int i = 0; i&lt; NBYTES; i ++)     {         octet [i] = ipAddress&gt;&gt; (i * 8);     }     sprintf(ipAddressFinal,“%d。%d。%d。%d”,octet [3],octet [2],octet [1],octet [0]);     LogAlways(“IP:\”%s \“”,ipAddressFinal); }