将整数值转换为IP地址

8

如何将32位整数值转换为IP地址?

我有一个int value=570534080,想将其转换为192.168.1.34


7
你可以调用 inet_ntoa 函数。 - David Heffernan
2个回答

12
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(void) {
    int value=570534080;
    struct in_addr addr = {value};
    printf( "%s", inet_ntoa( addr ) );
    return 0;
}

测试: http://ideone.com/RCDgj4

对于Windows,请使用#include <winsock2.h>


inet_ntoa函数不会产生可读的整数。请查看https://dev59.com/Aorda4cB1Zd3GeqPPrFq。 - Rezaeimh7

2
这里有一个32位整数570534080,可以拆分成四个8位无符号整数,它们正好是IP地址。
int value =  570534080; // which is 0x2201a8c0 (0x22, 0x01, 0xa8, 0xc0)
unsigned char *ip = &value;
/* then */
ip[0] == 192;
ip[1] == 168;
ip[2] == 1;
ip[3] == 34;    

请注意大小端(大端/小端),这会导致@KerrekSB的答案颠倒。
编辑后:
让我们更清楚地说明一下。
在谈论IP地址和整数时,我们实际上关心两种类型的整数:
1. IP地址的整数表示:`192.168.1.34 <==> (((192 * 256 + 168) * 256 + 1) * 256 + 34)` 2. 实际数据(可能是位流)以32位整数接收和解释,就像本OP提供的那样:`570534080 <==> (0x22, 0x01, 0xa8, 0xc0)(在小端机器上) <==> (34.1.168.192)`。
请注意,这是特定于平台并且危险的!因为这依赖于整数数字的字节顺序,即称为字节序。
再次编辑:
在这里,我会投票支持@DavidHeffernan的评论,建议使用`inet_ntoa`。

请看我的回答下面的评论。你的解决方案并不是我的“反向”。我的解决方案始终是正确的;而你的解决方案需要知道平台的字节序。 - Kerrek SB
@KerrekSB,很抱歉,但我不相信你的“我的代码总是正确的”。请看我的更新。 - starrify
是的,你说得对,我没有检查 OP 的实际值。我以为它是一个数字 IP 地址,但实际上它是解释为整数的线路数据。 - Kerrek SB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接