- 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, но мне страшно.
Ну, сравнение строк-то работает как надо. Во-от.
Потому что большие числа внутри строк кастуются в дабл?
Все правильно ведь сделал?
Сам отвечу на свой вопрос: да, это нормальная практика.
Странно при этом, что сравнение больших чисел, приведённых к строкам в десятичной системе счисления, работает.
PHP 5.3.
1. Сначала он ищет 0x или 0X и в случае успеха интерпретирует строку как шестнадцатеричное число.
2. Если длина шестнадцатеричной строки >= SIZEOF_LONG * 2, парсит её как шестнадцатеричную, но приводит к даблу.
3. Потом он пытается найти точку или e или E. Если находит, интерпретирует строку как дабл.
5. Сравнивает число знаков с MAX_LENGTH_OF_LONG. Если больше, то тоже интерпретирует как дабл.
6. Потом делает ещё непонятное сравнение для случая, когда число знаков точно равно MAX_LENGTH_OF_LONG - 1.
7. Если все тесты провалены, то парсит строку как лонг.
А если 0.0.7.0 и 0.0.69.0 (1792 и 17664, если я правильно посчитал).
Используем всю магию языка по максимому)))