我想将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);
}
答案 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_ntoa或getnameinfo将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); }