将整数值转换为ip-address

Siv*_*ran 6 c embedded

如何将32位整数值转换为ip-address?

我有,int value=570534080并希望将其转换为192.168.1.34.

kot*_*moy 11

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

适用于Windows #include <winsock2.h>


sta*_*ify 2

这里的 32 位整数570534080可以拆分为 4 个 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;    
Run Code Online (Sandbox Code Playgroud)

请注意字节序(大字节序/小字节序),这使得@KerrekSB 的答案相反。

编辑:

让我们说得更清楚一些。

当谈论 IP 地址和整数时,我们实际上关注两种类型的整数:

  1. IP地址的整数表示:192.168.1.34<==>(((192 * 256 + 168) * 256 + 1) * 256 + 34
  2. 您接收并解释为 32 位整数的实际数据(可能是位流),就像此 OP 提供的那样:570534080 <==> (0x22, 0x01, 0xa8, 0xc0)(on a little-endian machine) <==> (34.1.168.192)

请注意,这是特定于平台的并且很危险!由于这依赖于整数的字节顺序,这称为字节顺序。

再次编辑:

在这里,我投票支持 @DavidHeffernan 的评论,即使用inet_ntoa.