- 입력된 IP 값을 계산 가능한 수치로 변환하여 반환하는 로직입니다.
※ 정해진 규칙
public static Long ipToInt(String ipAddr) {
String[] ipAddrArray = ipAddr.split("\\.");
long num = 0;
for (int i=0;i<ipAddrArray.length;i++) {
int power = 3-i;
/*
* i의 값으 범위는 0~255 사이이며, 그 값을 256으로 나눈 나머지 값에
* 256을 power의 값인
* 1~9 사이는 2,
* 10~99 사이는 1,
* 100 이상은 0 의 값에 누승하여 num 값에 더함
*/
num += ((Integer.parseInt(ipAddrArray[i])%256 * Math.pow(256,power)));
}
return num;
}
- Long 값을 IP 로 변환하는 로직입니다. 기본이 Int 형이나, int 형의 범위가 -2147483648 ~ 2147483647 입니다. 그런데 IP 를 수치로 변환하게 되면 2147483647 를 넘는 경우가 생깁니다. 그래서 Long 형으로 처리해야합니다. ^^
※ 정해진 규칙
public static String intToIp(long num) {
return ((num >> 24 ) & 0xFF) + "." +
((num >> 16 ) & 0xFF) + "." +
((num >> 8 ) & 0xFF) + "." +
( num & 0xFF);
}
결국 이것은 약속이므로 임의대로 바꾸면 안됩니다.
부연설명을 드리자면,
※ DB Call 1. Maxmind 에서 나오는 DB Query
SELECT MOD(ROUND(1044455424 / 16777216), 256) AS X
,MOD(ROUND(1044455424 / 65536), 256) AS Y
,MOD(ROUND(1044455424 / 256), 256) AS A
,MOD(1044455424, 256) AS Z FROM DUAL;
Maxmind(http://www.maxmind.com/) 사이트에서 찾을 수 있는 DB Query 지만, 실은 이것과 위의 자바 상의 로직은 결과값이 틀립니다.
예를 들자면, 1357611007 로 확인했을때, 자바소스는 80.235.127.255 , DB Query 는 81 235 128 255 가 나옵니다.
※ DB Call 2.
SELECT MOD(TRUNC(1357611007 / 16777216), 256)
,MOD(TRUNC(1357611007 / 65536), 256)
,MOD(TRUNC(1357611007 / 256), 256)
,MOD(1357611007, 256) FROM DUAL;
만약 DB Call 로 검색할려고 한다면, 해당 방식으로 진행해야합니다. 비트 단위로 쉬프트 한 다음에 8자리 비트만 확인하여 각 자리 수를 확인하는 로직이므로 DB 도 마찬가지로 진행해야합니다.