- 1
- 2
- 3
- 4
/* Convert IP address to unsigned long int. */
function ip2ulong($ip) {
return sprintf("%u", ip2long32($ip));
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+144
/* Convert IP address to unsigned long int. */
function ip2ulong($ip) {
return sprintf("%u", ip2long32($ip));
}
https://github.com/pfsense/pfsense/blob/master/etc/inc/util.inc#L414-L417
Продолжаем осторожно идти дальше. Это нормально вообще? Да, я видел всякие смехуёчки с магическим приведением типов в PHP и JS, так что наверняка оно где-то правильно конвертится и все работает несмотря ни на что и вопреки. Может, это даже нормальная практика в мире PHP, но мне страшно.
superhacker777 17.05.2015 22:47 # +1
Ну, сравнение строк-то работает как надо. Во-от.
bormand 17.05.2015 23:15 # 0
Потому что большие числа внутри строк кастуются в дабл?
superhacker777 17.05.2015 23:20 # 0
inkanus-gray 17.05.2015 23:28 # +1
superhacker777 17.05.2015 23:33 # 0
superhacker777 17.05.2015 23:40 # 0
Все правильно ведь сделал?
inkanus-gray 17.05.2015 23:48 # 0
superhacker777 17.05.2015 23:49 # +1
Сам отвечу на свой вопрос: да, это нормальная практика.
inkanus-gray 17.05.2015 23:26 # +1
Странно при этом, что сравнение больших чисел, приведённых к строкам в десятичной системе счисления, работает.
superhacker777 17.05.2015 23:30 # 0
inkanus-gray 17.05.2015 23:39 # +2
PHP 5.3.
bormand 17.05.2015 23:48 # 0
superhacker777 17.05.2015 23:58 # +1
inkanus-gray 18.05.2015 00:02 # 0
1. Сначала он ищет 0x или 0X и в случае успеха интерпретирует строку как шестнадцатеричное число.
2. Если длина шестнадцатеричной строки >= SIZEOF_LONG * 2, парсит её как шестнадцатеричную, но приводит к даблу.
3. Потом он пытается найти точку или e или E. Если находит, интерпретирует строку как дабл.
5. Сравнивает число знаков с MAX_LENGTH_OF_LONG. Если больше, то тоже интерпретирует как дабл.
6. Потом делает ещё непонятное сравнение для случая, когда число знаков точно равно MAX_LENGTH_OF_LONG - 1.
7. Если все тесты провалены, то парсит строку как лонг.
inkanus-gray 18.05.2015 00:08 # 0
Qwertiy 18.05.2015 00:00 # 0
А если 0.0.7.0 и 0.0.69.0 (1792 и 17664, если я правильно посчитал).
Qwertiy 18.05.2015 00:02 # +1
Используем всю магию языка по максимому)))
inkanus-gray 18.05.2015 00:11 # 0
superhacker777 18.05.2015 00:15 # +1