IPRange
#32683388
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
Ссылка на профиль пользователя:
|
|
|
Код дeлает следующее:
syntax:
IPRange = new IPRange(new String[]{"ip1", "ip2"});
Формат IP:
127.0.0.1
127.0.0.1/20
127.0.0.1/20,22,23
127.0.0.*
Проверяет, входит ли ip адрес, указанный в matches к одному из диапозонов, указанных в конструкторе.
127.0.0.1/20,22,23
озанчает, что это ip:
начиная с 127.0.0.1 по 127.0.0.20
127.0.0.22
127.0.0.23
Использовать регулярные выражения нельзя.
Подскажите, как можно немного упростить.
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88.
public class IPRange {
//входные данные
String range;
//массив ip-адресов
String[] rangeArray;
public IPRange(String aRange[]) {
this.rangeArray = aRange;
}
public boolean matches(String ip) {
for (int n = 0; n < this.rangeArray.length; n++) {
range = rangeArray[n];
//длина строки range
int range_length = range.length();
//длина строки ip
int ip_length = ip.length();
//позиция последнего символа "." в range
int rangeLastIndexDot = range.lastIndexOf(".");
//позиция последнего символа "." в ip
int ipLastIndexDot = ip.lastIndexOf(".") + 1;
if (range_length < 7 || ip_length < 7) {
return false;
}
if (!(range.substring(0, rangeLastIndexDot).equalsIgnoreCase(ip.substring(0, ipLastIndexDot - 1)))) {
continue;
}
//суффикс ip
byte ip_suff = (byte) Integer.parseInt(ip.substring(ipLastIndexDot, ip_length));
//для range типа 127.0.0.1/20 || 127.0.0.1/20,34,33
if (range.indexOf("/") > 0) {
//конечная часть ip-адреса (127.0.0._1\24,4_)
String range_suff = range.substring(rangeLastIndexDot + 1, range_length);
//индекс слэша
byte rangeLastIndexSlash = (byte) range_suff.indexOf("/");
//начало диапозона
byte start_number = (byte) Integer.parseInt(range_suff.substring(0, rangeLastIndexSlash));
// System.out.println(start_number);
//конец диапозона
byte end_number;
//27.0.0.1\20,21,23,25,28
if (range_suff.indexOf(",") > 0) {
end_number = (byte) Integer.parseInt(range_suff.substring(rangeLastIndexSlash + 1, range_suff.indexOf(",")));
String tmp = range_suff.substring(rangeLastIndexSlash + 1, range_suff.length());
String[] other_numbers = new String[tmp.split(",").length + 1];
other_numbers = tmp.split(",");
for (int i = 0; i < other_numbers.length; i++) {
if (ip_suff == (byte) Integer.parseInt(other_numbers)) {
return true;
}
}
}
try {
end_number = (byte) Integer.parseInt(range_suff.substring(rangeLastIndexSlash + 1));
} catch (Exception e) {
end_number = (byte) Integer.parseInt(range_suff.substring(rangeLastIndexSlash + 1, range_suff.indexOf(",")));
}
for (int i = start_number; i <= end_number; i++) {
if (i == ip_suff) {
return true;
}
}
}
[i]//для range вида 127.0.0.*
if (range.indexOf("*") > 0) {
for (int i = 0; i <= 255; i++) {
if (ip_suff == i) {
return true;
}
}
}
}
return false;
}
}
Тест к нему:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
import junit.framework.TestCase;
/**
* Created by IntelliJ IDEA.
* User: ozzy
* Date: 26.08.2004
* Time: 12:46:45
* To change this template use File | Settings | File Templates.
*/
public class IPRangeTest extends TestCase {
public void testIPRange() {
IPRange iprange = new IPRange(new String[]{"127.0.0.1/20,33,34,56,89,100,122", "192.168.0.1/40,65", "198.23.65.15/23"});
assertTrue(iprange.matches("198.0.65.21"));
}
}
|
|