0

我得到了一个带有 IPv6 地址的名为 ipv6 的字符串。我想将 IP 用于 DNSBL 作为 zen spamhaus 或其他 DNS。我该怎么做 ?以下代码在压缩的 IPv6 中无法按预期工作。我怎样才能零填充?C++ 中的所有代码。

std::string invertirv6 (const std::string &str) {
    struct in6_addr *addr;
    inet_pton(AF_INET6,str.c_str(),&addr);
    char str2[41];

    sprintf(str2,"%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x",
    (int)addr->s6_addr[15], (int)addr->s6_addr[14],
    (int)addr->s6_addr[13], (int)addr->s6_addr[12],
    (int)addr->s6_addr[11], (int)addr->s6_addr[10],
    (int)addr->s6_addr[9], (int)addr->s6_addr[8],
    (int)addr->s6_addr[7], (int)addr->s6_addr[6],
    (int)addr->s6_addr[5], (int)addr->s6_addr[4],
    (int)addr->s6_addr[3], (int)addr->s6_addr[2],
    (int)addr->s6_addr[1], (int)addr->s6_addr[0]);
    string retorno = str2;
    return retorno;
}
4

1 回答 1

1

这个程序有多个问题:

  1. string retorno = str2;没有命名空间,'string' was not declared in this scope是编译器错误。很容易修复。

    std::string retorno = str2;
    
  2. struct in6_addr *addr;只为指向结构的指针分配空间,但从不分配结构本身的内存。这是坠机的直接原因。

    我将通过在堆栈上分配它来快速解决这个问题,并且因为它不再是一个指针,所以使用.而不是访问结构成员->

    struct in6_addr addr;
    

    但是,一旦您解决了这个问题,您的程序将再次崩溃,原因是:

  3. char str2要编入其中的行来说太小了sprintf,这需要 47 个打印字符和一个空终止符。

    这很容易修补:

    char str2[48];
    
  4. 显式类型转换int为不必要的,可以省略。

一个工作程序如下所示:

#include <cstdio>
#include <string>
#include <arpa/inet.h>
#include <sys/socket.h>

std::string invertirv6 (const std::string &str) {
    struct in6_addr addr;
    inet_pton(AF_INET6,str.c_str(),&addr);
    char str2[48];

    sprintf(str2,"%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x",
    addr.s6_addr[15], addr.s6_addr[14],
    addr.s6_addr[13], addr.s6_addr[12],
    addr.s6_addr[11], addr.s6_addr[10],
    addr.s6_addr[9], addr.s6_addr[8],
    addr.s6_addr[7], addr.s6_addr[6],
    addr.s6_addr[5], addr.s6_addr[4],
    addr.s6_addr[3], addr.s6_addr[2],
    addr.s6_addr[1], addr.s6_addr[0]);
    std::string retorno = str2;
    return retorno;
}

int main(void) {
    std::string a = "2001:db8:fda8:eca7:b54:6685:c8ba:6891";
    std::string b = invertirv6(a);

    printf("%s\n", b.c_str());
}

这解决了所有崩溃并打印输出:

91.68.ba.c8.85.66.54.0b.a7.ec.a8.fd.b8.0d.01.20

但我认为这不完全是你说你想要的输出。您将需要更改sprintf调用,以您想要的格式准确打印您想要的内容。

于 2017-03-14T03:08:00.873 回答