1. PHP / Говнокод #22663

    −124

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    /**
         * Конвертирует шестнадцатеричное число в десятичное
         *
         * @param string $hex шестнадцатиричное число
         * @return string десятичное число
         */
        private static function convertHexToBase10(string $hex): string
        {
            $base10result = 0;
            foreach (str_split(trim($hex)) as $hexPart) {
                $base10 = base_convert($hexPart, 16, 10);
                $base10result = gmp_add(gmp_mul($base10result, 16), $base10);
            }
    
            return $base10result;
        }

    Задания для самопроверки:
    1. Найдите ошибку в phpdoc.
    2. Укажите функцию из стандартной поставки PHP, которая делает то же самое.
    3. Дана строка, представляющая md5-хеш, то есть строковое представление 128-битного шестнадцатиричного числа. Напишите пример вызова функции из стандартной поставки PHP, возвращающую остаток от деления этого числа на 3, не используя функцию из предыдущего задания.

    Запостил: anei, 23 Марта 2017

    Комментарии (14) RSS

    • показать все, что скрытоа че. мне уже даже интересно стало - на MD & SHA ключики как на числа посмотреться. о - и мак аддреса тоже. и даже IPv4/6 аддреса. а мы дураки с ними как массивами мучаемся - а их ведь можно в число просто сконвертить! красота среди бегущих!
      Ответить
      • показать все, что скрытоЭто что, я даже текст не более чем из 8 байт могу в сишечке и плюсах в uint64_t переменную засунуть на 64-битном проце
        Ответить
      • показать все, что скрытоIP адреса - это и есть числа, точки там разделяют байты (октеты) только для удобства человеков. А маска подсети - это на самом деле и есть битовая маска, при наложении (т.е. операция логического И) которой на ip получается та часть адреса, которая иденцифицирует подсеть.
        Примерно так:
        echo inet_ntop(inet_pton('192.168.0.32') & inet_pton('255.255.255.128'));
        // 192.168.0.0
        echo inet_ntop(inet_pton('192.168.0.253') & inet_pton('255.255.255.128'));
        // 192.168.0.128


        В стародавние времена админил я потихоньку в одной конторе, заодно и сайт говнокодил. При переезде админ провайдера выдал нам ip, маску (маска была очень узкая, там буквально пара бит оставалась на идентификатор узла) и адрес шлюза. Вбиваю - интернета нет, шлюз не пингуется. Накладываю маску на наш айпишник и на айпи шлюза, и обнаруживаю, что они с такой маской вообще не в одной подсети. Пришлось звонить провайдеру, долго и нудно объяснять, как работает маска подсети, админ не сразу допёр, в чём проблема.

        Вот такая админская версия говнокода.
        Ответить
    • показать все, что скрытоhttp://php.net/manual/ru/function.hex2bin.php
      это плохой знак, что я это знаю, да?
      Ответить
    • показать все, что скрыто# 1. Найдите ошибку в phpdoc.
      # * @return string десятичное число
      # foreach(str_split(trim($hex)) as ...)
      # $base10result = 0;
      # return $base10result;

      А вдруг str_split вернёт пустой итерируемый объект и функция вернёт 0 (int, а не string)?
      Ответить

    Добавить комментарий