2013-05-04 50 views
4

我有一个IP地址,例如char *ip = "192.168.1.13"并且需要将它转换成这个"13.1.168.192" C中已经存在一个合适的可能性,或者我必须通过简单地将令牌再次放在一起来自己完成吗?将IP转换为反向ip查找

+0

我不认为有在一般的字符串这样的功能,但有一个共同的伎俩:字符串反向每个“字”(即'“291.861.1.31”') ,然后反转整个字符串。 – dasblinkenlight 2013-05-04 10:28:27

+1

首先,IPv4地址是32位。这就是它在所有与套接字相关的功能中的表现。也许用'htons'和朋友改变字节顺序? – KAction 2013-05-04 10:28:54

+0

你是否正在颠倒IP地址来混淆反向DNS? – 2013-05-04 10:30:19

回答

9

您可以随时使用inet_pton将其转换为二进制格式,使其易于翻转,然后转换回inet_ntop的文本。


请记住,IPv4地址只是一个32位无符号整数。交换周围的字节非常简单。

事情是这样的:

const char ip[] = "192.168.0.1"; 
char reversed_ip[INET_ADDRSTRLEN]; 

in_addr_t addr; 

/* Get the textual address into binary format */ 
inet_pton(AF_INET, ip, &addr); 

/* Reverse the bytes in the binary address */ 
addr = 
    ((addr & 0xff000000) >> 24) | 
    ((addr & 0x00ff0000) >> 8) | 
    ((addr & 0x0000ff00) << 8) | 
    ((addr & 0x000000ff) << 24); 

/* And lastly get a textual representation back again */ 
inet_ntop(AF_INET, &addr, reversed_ip, sizeof(reversed_ip)); 

此代码后,变量reversed_ip包含崇敬地址为一个字符串。

+0

它得到了这个到目前为止unsigned char buf [sizeof(struct in_addr)]; \t inet_pton(AF_INET,“192.168.1.13”,buf);但我不确定如何现在扭转它? – wasp256 2013-05-04 10:57:43

+0

@ wasp256添加了一些示例(但未经测试)的代码。 – 2013-05-04 11:52:30

+0

@ wasp256现在已经测试过了,工作正常。 – 2013-05-04 13:57:21

1

将ip拆分成数组并使用代码来反转数组。

这里的代码整齐地排列扭转位我发现这里:http://www.programmingsimplified.com/c-program-reverse-array

#include <stdio.h> 

int main() 
{ 
    int n, c, d, a[100], b[100]; 

    printf("Enter the number of elements in array\n"); 
    scanf("%d", &n); 

    printf("Enter the array elements\n"); 

    for (c = 0; c < n ; c++) 
     scanf("%d", &a[c]); 

    /* 
    * Copying elements into array b starting from end of array a 
    */ 

    for (c = n - 1, d = 0; c >= 0; c--, d++) 
     b[d] = a[c]; 

    /* 
    * Copying reversed array into original. 
    * Here we are modifying original array, this is optional. 
    */ 

    for (c = 0; c < n; c++) 
     a[c] = b[c]; 

    printf("Reverse array is\n"); 

    for (c = 0; c < n; c++) 
     printf("%d\n", a[c]); 

    return 0; 
} 
1

您可以将字符串转换为addrinfogetaddrinfo。指定AI_NUMERICHOST以防止DNS查找。

addrinfo hint; 
memset(&hint, 0, sizeof(addrinfo)); 
hint.ai_socktype = SOCK_STREAM; 
hint.ai_protocol = IPPROTO_TCP; 
hint.ai_family = AF_INET; 
hint.ai_flags = AI_NUMERICHOST; // prevents dns lookup 

addrinfo *result = nullptr; 
if (getaddrinfo(name, nullptr, &hint, &result)) 
    return false; 

uint32_t ip; 
memcpy(&ip, &result, sizeof(uint32_t)); 

uint32_t ipreversed = htonl(ip); 

freeaddrinfo(result); 
+0

这是否也与IPv6地址一起工作? – dpb 2016-04-01 14:04:00

3
int a,b,c,d; 
char *ip = "192.168.1.13" 
char ip2[16]; 
sscanf(ip,"%d.%d.%d.%d",&a,&b,&c,&d); 
sprintf(ip2, "%d.%d.%d.%d", d, c, b, a); 
2
#include <stdio.h> 
#include <string.h> 

void swap(char *a, char *b){ 
    char wk = *a; 
    *a = *b; 
    *b = wk; 
} 

void strpartrev(char *s, int len){ 
    int i,j; 
    for(i=0,j=len-1; i<len/2 ;++i,--j) 
     swap(s + i, s + j); 
} 

char *strwordrev(char *str, char delimiter){ 
    //str change destructively 
    int sp = -1, wordlen=0; 
    char stack[16], *p=str; 

    while(*p){ 
     if(*p == delimiter){ 
      strpartrev(stack + sp - wordlen + 1, wordlen); 
      wordlen = 0; 
     } else { 
      ++wordlen; 
     } 
     stack[++sp] = *p++; 
    } 
    strpartrev(stack + sp - wordlen + 1 , wordlen); 
    p = str; 
    do{ 
     *p++ = stack[sp--]; 
    }while(sp>=0); 

    return str; 
} 

char *strWordRev(char *str, char delimiter){ 
    //str change destructively 
    char *head, *tail; 
    int len = strlen(str); 

    head = str; 
    while(tail = strchr(head, delimiter)){ 
     strpartrev(head, tail - head); 
     head = tail + 1; 
    } 
    strpartrev(head, str + len - head); 
    strpartrev(str, len); 

    return str; 
} 

int main(void){ 
    char *ip = "192.168.1.13"; 
    char rip[16]; 

    strcpy(rip, ip); 
    printf("%s\n", strWordRev(rip, '.'));//13.1.168.192 

    return 0; 
}