Давайте сначала посмотрим на пример кода:
Скопируйте код кода следующим образом:
класс
{
Privatestaticlongiptolong (строковая полоса)
//Преобразуем IP-адрес в форме 127.0.0.1 в десятичное целое число. Здесь обработка ошибок не выполняется.
{
интервал = 0;
инти=0;
длинный[]ip=newlong[4];
intposition1=strip.indexof(".");
intposition2=strip.indexof(".",position1+1);
intposition3=strip.indexof(".",position2+1);
ip[0]=long.parselong(strip.substring(0,position1));
ip[1]=long.parselong(strip.substring(position1+1,position2));
ip[2]=long.parselong(strip.substring(position2+1,position3));
ip[3]=long.parselong(strip.substring(position3+1));
return(ip[0]<<24)+(ip[1]<<16)+(ip[2]<<8)+ip[3];//ip1*256*256*256+ip2*256* 256+ip3*256+ip4
}
Privatestaticstringlongtoip(longlongip)
//Преобразуйте десятичное целое число в IP-адрес в виде 127.0.0.1, введите ping3396362403l в командной строке
{
stringbuffersb = newstringbuffer("");
sb.append(string.valueof(longip>>>24));//сдвиг вправо на 24 бита напрямую
sb.append(".");
sb.append(string.valueof((longip&0x00ffffff)>>>>16));//Устанавливаем старшие 8 бит на 0, а затем сдвигаем вправо на 16 бит
sb.append(".");
sb.append(string.valueof((longip&0x0000ffff)>>>>8));
sb.append(".");
sb.append(string.valueof(longip&0x000000ff));
sb.append(".");
возвращаетb.tostring();
}
publicstaticvoidmain(строка[]args)
{
system.out.println("Различные выражения IP-адреса: rn");
system.out.print("32-битная двоичная форма: ");
system.out.println(long.tobinarystring(3396362403l));
system.out.print("Десятричная форма:");
system.out.println(iptolong("202.112.96.163"));
system.out.print("Общая форма:");
system.out.println(longtoip(3396362403l));
}
}
Результаты запуска:
Различные проявления IP-адресов:
32-битная двоичная форма: 11001010011100000110000010100011.
Десятичная форма: 3396362403.
Общая форма: 202.112.96.163.
Вывод завершен (занимает 1 секунду) - нормальное завершение. Давайте поэтапно разберем точки знаний: двоичное число, сдвинутое влево на n бит, состоит в том, чтобы умножить значение числа на 2, возведенное в n-ю степень, и разделить на два, это сдвиг вправо на одну позицию
1. Преобразование IP-адреса в целое число <BR>Принцип: каждый сегмент IP-адреса можно рассматривать как 8-битное целое число без знака, то есть 0–255. Разделите каждый сегмент в двоичную форму и объедините его, а затем преобразуйте. двоичное число в беззнаковое число 32 является целым числом.
Пример: IP-адрес: 10.0.3.193.
Двоичное число, соответствующее каждому сегменту чисел
1000001010
000000000
300000011
19311000001
Комбинация: 00001010000000000000001111000001. При преобразовании в десятичное число это: 167773121, то есть преобразованное число IP-адреса и есть оно.
Код выглядит следующим образом
Скопируйте код кода следующим образом:
publicclassIp{
publicstaticvoidmain(String[]args){
System.out.print(ip2int("10.0.3.193"));
}
publicstaticlongip2int(Stringip){
String[]items=ip.split(".");
returnLong.valueOf(items[0])<<24
|Long.valueOf(элементы[1])<<16
|Long.valueOf(элементы[2])<<8
|Long.valueOf(элементы[3]);
}
}
2. Преобразуйте целое число в IP-адрес. <BR>Принцип: преобразуйте это целое число в 32-битное двоичное число. Слева направо разделите каждые 8 бит, чтобы получить 4 сегмента 8-битных двоичных чисел. Преобразуйте эти двоичные числа в целые числа и добавьте «.». Пример: 167773121.
Двоичное представление: 00001010000000000000001111000001.
Разделите его на четыре сегмента: 00001010, 00001010, 00000011, 11000001. Преобразовав их в целые числа и добавив ".", вы получите 10.0.3.193.
Код выглядит следующим образом
Скопируйте код кода следующим образом:
publicclassIp{
publicstaticvoidmain(String[]args){
System.out.print(int2ip(167773121));
}
publicstaticStringint2ip(longipInt){
StringBuildersb = newStringBuilder();
sb.append(ipInt&0xFF).append(".");
sb.append((ipInt>>8)&0xFF).append(".");
sb.append((ipInt>>16)&0xFF).append(".");
sb.append((ipInt>>24)&0xFF);
возвращаетb.toString();
}
}