我有一个名为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;
}
答案 0 :(得分:0)
该计划有多个问题:
string retorno = str2;
没有命名空间,'string' was not declared in this scope
是编译器错误。很容易解决。
std::string retorno = str2;
struct in6_addr *addr;
仅为结构分配指针的空间,但从不分配结构本身的内存。这是事故的直接原因。
我只是通过在堆栈上分配它来快速解决这个问题,并且因为它不再是指针,所以使用.
而不是->
来访问struct成员。
struct in6_addr addr;
一旦你解决了这个问题,你的程序将再次崩溃,原因是:
char str2
对于sprintf
行来说太小了,这需要47个打印字符和一个空终结符。
这很容易修补:
char str2[48];
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
调用,以您希望的格式打印出您想要的内容。