Преобразование IP-адреса в десятичный и наоборот

Предположим, что мое десятичное число – это 9766322441 поэтому его соответствует 70.30.65.9 но когда этот IP-адрес преобразуется обратно, он дает некоторое другое десятичное число 1176387849 … и когда я конвертирую IP-адрес pf google.com, то есть 64.233.187.99 тогда он дает 1089059683 и обратное преобразование дает правильный IP-адрес, то есть 64.233.187.99

Мой вопрос в том, что не так с вышеупомянутым номером упоминания? Я также пытаюсь использовать 9579342332 но тот же результат. Это дает неправильное обратное преобразование ??

В чем причина этого?

Вы можете использовать этот калькулятор для расчетов.

    Адреса IPv4 находятся на 32 бит.

    Число 9 9,766,322,441 не может быть представлено на 32 бит (макс: 4,294,967,295 ).

    У вас неправильные значения 70.30.65.9 будут соответствовать 1176387849, но никогда с 9766322441.

    Ограничение 32 бит – Java: как конвертировать dec в 32bit int?

    C ++ Пример преобразования IP в десятичный:

     #include <iostream.h> main() { // Initialize the variables unsigned long a,b,c,d,base10IP; // Get the IP address from user cout << "\nEnter an IP address in dotted quad notation (xxxx)"; cout << "\nwith each section seperated by a space: "; cin >> a >> b >> c >> d; // Do calculations to convert IP to base 10 a *= 16777216; b *= 65536; c *= 256; base10IP = a + b + c + d; // Output new IP address cout << "\nThe converted address is: " << base10IP << '\n'; } 

    Это класс JAVA для преобразования IP в десятичный:

     /** * @author Charles Johnson * from http://www.technojeeves.com/joomla/index.php/free/58-convert-ip-address-to-number */ public class IpConverter { public static void main(String[] args) { System.out.println(longToIp(Long.valueOf(args[0], 16))); } public static String toHex(String ipAddress) { return Long.toHexString(IpConverter.ipToLong(ipAddress)); } public static long ipToLong(String ipAddress) { long result = 0; String[] atoms = ipAddress.split("\\."); for (int i = 3; i >= 0; i--) { result |= (Long.parseLong(atoms[3 - i]) << (i * 8)); } return result & 0xFFFFFFFF; } public static String longToIp(long ip) { StringBuilder sb = new StringBuilder(15); for (int i = 0; i < 4; i++) { sb.insert(0, Long.toString(ip & 0xff)); if (i < 3) { sb.insert(0, '.'); } ip >>= 8; } return sb.toString(); } } 

    Другой пример JAVA для преобразования IP в десятичный:

     String ip="70.30.65.9"; String[] addrArray = ip.split("\."); long num = 0; for (int i = 0; i < addrArray.length; i++) { int power = 3 - i; num += ((Integer.parseInt(addrArray[i]) % 256 * Math.pow(256, power))); } 

    Функция PHP для преобразования IP в дискриминантный:

     function myip2long($ip) { if (is_numeric($ip)) { return sprintf( "%u", floatval($ip) ); } else { return sprintf( "%u", floatval(ip2long($ip) )); } } 

    Попробуйте применить его, например:

     echo myip2long("192.168.1.1"); 

    Другой пример в PHP для преобразования IP в decimical:

     function myip2long2($ip){ $d = 0.0; $b = explode(".", $ip,4); for ($i = 0; $i < 4; $i++) { $d *= 256.0; $d += $b[$i]; }; return $d; } 

    Это даст вам тот же результат, что и выше:

    Пример PHP для преобразования десятичного кода в IP:

     function customLong2ip($ip){ $b=array(0,0,0,0); $c = 16777216.0; $ip += 0.0; for ($i = 0; $i < 4; $i++) { $k = (int) ($ip / $c); $ip -= $c * $k; $b[$i]= $k; $c /=256.0; }; $d=join('.', $b); return($d); } 

    Вы превысили допустимый диапазон IPV4 с десятичным значением 9766322441. Если он переведен в Hex, он дает вам значение 0x2461E4109, которое занимает 5 октетов вместо 4:

     02, 46, 1e, 41, 09 

    Калькулятор просто обрезает октет со значением 0x02 и преобразует значение с использованием 4 наименее значимых октетов.

    Расчеты для 0x461E4109 дают вам «70.30.65.9», который показывает калькулятор.


    Как это сделать в Java:

    Я рекомендую использовать стандартные классы Java для манипуляций InetAddress. Это должно работать как с IPV4, так и с IPv6: http://docs.oracle.com/javase/1.5.0/docs/api/java/net/InetAddress.html

    Возможно, вы смотрите на что-то вроде (я использовал Java более 10 лет назад, поэтому не стесняйтесь исправлять ошибки синтаксиса, если вы их найдете)

     InetAddress Address = InetAddress.getByName("192.168.0.1"); InetAddress Address = InetAddress.getByName(raw2); String s1 = Address.toString(); byte[] raw = Adress.getAddress(); byte[] rawIPv4 = {192, 168, 0, 1}; InetAddress Address1 = InetAddress.getByName(rawIPV4); InetAddress Address2 = InetAddress.getByName("2607:f0d0:1002:51::4"); byte[] rawIPV6 = Adress.getAddress(); 

    Пример IPv6 также охватывает случай «сжатых нулей» в адресе («::» между 51 и 4).

    В любом случае, вы можете проверить это для преобразования массива байтов в integer:
    Байт-массив и преобразование Int в Java

    Обратите внимание, однако, что формат IPV6 использует 16 байт для одного IP-адреса, поэтому я не уверен, можете ли вы представить его с одним целым значением, как показано в калькуляторе.

    При чтении исходного сообщения и последующих последующих сообщений в ответ на ответы людей я получаю отчетливое впечатление, что ваш оригинальный десятизначный десятичный номер на самом деле является номером телефона, который вы хотите каким-то образом превратить в IP-адрес.

    «потому что я хочу разработать алгоритм преобразования мобильного телефона в ip и наоборот»,

    Это не работает. Это похоже на вопрос, как взять MAC-адрес и преобразовать его в IP-адрес. Номера телефонов и IP-адреса выделяются двумя совершенно разными органами. Существует не алгоритм для связи между ними.

    Фактически IP-адреса МОГУТ быть преобразованы в 32-битные java-целые числа, просто так, что число может быть отрицательным. Это действительно нормально, потому что вы можете конвертировать его обратно и обратно без потери данных. Теперь, если вы действительно хотите использовать дополнительные 32 бита и хранить его в длинных просто так, чтобы он не выглядел негативным для java, вы можете, но его расточительность. Вы можете написать функцию, чтобы отложить ее до конца и отобразить ее без знака, но сохранить ее в и int.

    Вопрос в том, почему 9766322441 конвертировал в 70.30.65.9, но при обратном возвращении он дает 1176387849 вместо 9766322441. Ответ в том, что 4294967296 – это максимально возможное десятичное число, представленное IP 256.256.256.256.

    Выше 4294967296 он будет конвертировать в число ниже 256.256.256.256 в обратном пути, точно так же, как прокатка одометра на вашем автомобиле. 9766322441 явно более чем в два раза превышает значение 4294967296 и заканчивает прокачку одометра, дважды заканчивая 1176387849 на третьем рулоне одометра. Этот новый номер затем будет конвертироваться в и с IP-адреса, как обычно, в пределах диапазона.

    Есть также некоторые способы сделать это в Excel. некоторые из расчетов бесполезны, но самым простым является использование функции, определяемой пользователем, как показано в этом сообщении. Как сортировать списки адресов IP-адресов в Excel