/* * Copyright 2014 jts * * Licensed under the Apache License, Version 2.0 (the "License") * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ru.jts.common.network.util; /** * @author : Camelion * @date : 17.08.12 22:43 * <p/> * Класс-помощник для создания перенаправлений. * Что-то подобное используется в Aion-emu, L2J, L2P, etc. */ public class IPRange { private long minAddress; private long maxAddress; private byte[] minAddressInByte; private byte[] maxAddressInByte; private byte[] routeAddress; public IPRange(String minAddress, String maxAddress, String routeAddress) { this.minAddress = toLong(minAddress); this.maxAddress = toLong(maxAddress); this.minAddressInByte = toByteArray(minAddress); this.maxAddressInByte = toByteArray(maxAddress); this.routeAddress = toByteArray(routeAddress); } public IPRange(byte[] minAddress, byte[] maxAddress, byte[] routeAddress) { this.minAddress = toLong(minAddress); this.maxAddress = toLong(maxAddress); this.minAddressInByte = minAddress; this.maxAddressInByte = maxAddress; this.routeAddress = routeAddress; } /** * Разбивает адрес типа IPv4 на массив длиной 4 * Например 127.0.0.1 = {127, 0, 0, 1}; * * @param address - адрес в формате IPv4 * @return - массив байтов, содержащий данный адрес */ public static byte[] toByteArray(String address) { byte[] result = new byte[4]; String[] strings = address.split("\\."); for (int i = 0, n = strings.length; i < n; i++) { result[i] = (byte) Integer.parseInt(strings[i]); } return result; } /** * Переводит IPv4 адрес в число типа long * * @param address - String адрес в формате IPv4 * @return число типа long */ public long toLong(String address) { byte[] byteAddress = toByteArray(address); long result = 0; result += (byteAddress[3] & 0xFF); result += ((byteAddress[2] & 0xFF) << 8); result += ((byteAddress[1] & 0xFF) << 16); result += (byteAddress[0] << 24); return result & 0xFFFFFFFFL; } /** * Переводит IPv4 адрес в число типа long * * @param address - byte[] адрес в формате IPv4 * @return число типа long */ public long toLong(byte[] address) { long result = 0; result += (address[3] & 0xFF); result += ((address[2] & 0xFF) << 8); result += ((address[1] & 0xFF) << 16); result += (address[0] << 24); return result & 0xFFFFFFFFL; } /** * Проверяет, находится ли адрес в заданом диапазоне адресов * * @param address - проверяемый адрес * @return - true, если адрес попадает в диапазон, иначе - false */ public boolean isInRange(String address) { long addr = toLong(address); return addr >= minAddress && addr <= maxAddress; } public byte[] getRouteAddress() { return routeAddress; } public byte[] getMinAddressInByte() { return minAddressInByte; } public byte[] getMaxAddressInByte() { return maxAddressInByte; } }