8

我编写了一个将 IP 地址作为参数的程序,我想将此 IP 地址存储在 unit32_t 中。我可以轻松地将 uint32_t 转换回字符数组。如何将字符数组中的 IP 地址转换为 uint32_t。

例如

./IPtoCHAR 1079733050

uint32_t 到 IP 地址 => 64.91.107.58

但是如何编写一个执行相反任务的程序呢?

./CHARtoIP 64.91.107.58


对于第一个 IPtoCHAR,它是

无符号整数 ipAddress = atoi(argv[1]);

printf("IP 地址 %d.%d.%d.%d \n",((ipAddress >> 24) & 0xFF),((ipAddress >> 16) & 0xFF),((ipAddress >> 8) & 0xFF),(IP 地址 & 0xFF));

但是下面的所有这些都不起作用

uint32_t aa=(uint32_t)("64.91.107.58");

uint32_t aa=atoi("64.91.107.58");

uint32_t aa=strtol("64.91.107.58",NULL,10);

4

2 回答 2

14

您使用inet_pton. 功能

相反,您应该使用inet_ntop.


有关特定于 Windows 的文档,请参阅inet_ptoninet_ntop


请注意,这些函数可用于 IPv4 和 IPv6。

于 2013-03-27T07:30:02.503 回答
4

如果您无法访问 inet_* 函数或由于任何其他奇怪的原因需要自己编写代码,您可以使用如下函数:

#include <stdio.h>

/**
 * Convert human readable IPv4 address to UINT32
 * @param pDottedQuad   Input C string e.g. "192.168.0.1"
 * @param pIpAddr       Output IP address as UINT32
 * return 1 on success, else 0
 */
int ipStringToNumber (const char*       pDottedQuad,
                              unsigned int *    pIpAddr)
{
   unsigned int            byte3;
   unsigned int            byte2;
   unsigned int            byte1;
   unsigned int            byte0;
   char              dummyString[2];

   /* The dummy string with specifier %1s searches for a non-whitespace char
    * after the last number. If it is found, the result of sscanf will be 5
    * instead of 4, indicating an erroneous format of the ip-address.
    */
   if (sscanf (pDottedQuad, "%u.%u.%u.%u%1s",
                  &byte3, &byte2, &byte1, &byte0, dummyString) == 4)
   {
      if (    (byte3 < 256)
           && (byte2 < 256)
           && (byte1 < 256)
           && (byte0 < 256)
         )
      {
         *pIpAddr  =   (byte3 << 24)
                     + (byte2 << 16)
                     + (byte1 << 8)
                     +  byte0;

         return 1;
      }
   }

   return 0;
}
于 2016-03-30T14:43:29.667 回答