#include <iostream>
#include <utility>
#include <string>
#include <cstring>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <variant>
using namespace std;
union Ip {
unsigned int ip_int;
unsigned char ip_arr[4];
};
inline bool is_little_endian() {
union {
short a;
char c;
} test;
test.a = 0x0102;
return test.c == 0x02;
}
void printIp(Ip *ip) {
if (is_little_endian()) {
cout << int(ip->ip_arr[3]) << "." << int(ip->ip_arr[2]) << "." << int(ip->ip_arr[1]) << "."
<< int(ip->ip_arr[0])
<< endl;
} else {
cout << int(ip->ip_arr[0]) << "." << int(ip->ip_arr[1]) << "." << int(ip->ip_arr[2]) << "."
<< int(ip->ip_arr[3])
<< endl;
}
}
#define INT_TO_DOT_IP(ip, buffer) \
int step = -1, start = 3; \
if (!is_little_endian()) { \
start = 0; \
step = 1; \
} \
buffer[start] = (ip >> 24); \
buffer[start += step] = (ip >> 16); \
buffer[start += step] = (ip >> 8); \
buffer[start += step] = ip ; \
if (is_little_endian()) { \
printf("%d.%d.%d.%d\n", buffer[3], buffer[2], buffer[1], buffer[0]); \
} else { \
printf("%d.%d.%d.%d\n", buffer[0], buffer[1], buffer[2], buffer[3]); \
}
int main() {
Ip ip;
int lstep = -1, lstart = 3;
if (!is_little_endian()) {
lstart = 0;
lstep = 1;
}
ip.ip_arr[lstart] = 192;
ip.ip_arr[lstart += lstep] = 168;
ip.ip_arr[lstart += lstep] = 0;
ip.ip_arr[lstart += lstep] = 1;
cout << ip.ip_int << endl;
printIp(&ip);
unsigned char buf[4];
INT_TO_DOT_IP(3232235521, buf);
cout << is_little_endian() << endl;
}