Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Перевести функцию с си на php


Автор: artmel 26.11.2015, 22:42
Помогите пожалуйста перевести функцию с си на пхп

Код

bool do_checksums()
   {
       int i;
       unsigned int* addr;
       unsigned int sum; 
       for (i = 0; i < num_checksum_areas; i++)
       { 
           if ((checksum_areas[i].addr_start % 4) != 0)
               return false;   
           if (checksum_areas[i].addr_start > checksum_areas[i].addr_end)
               return false;   
           if ((checksum_areas[i].addr_end % 4) != 3
               && checksum_areas[i].addr_start != checksum_areas[i].addr_end)
               return false;   

           sum = 0;
           for (addr = checksum_areas[i].addr_start; addr < checksum_areas[i].addr_end; addr++;)
               sum += *addr;

           if (sum + checksum_areas[i].checksum_value != 0x55555555)
               return false;  
       }
       return true;   
   }


не понимаю конструкций
checksum_areas[i].addr_start % 4

 && checksum_areas[i].addr_start 

Автор: s1lver 27.11.2015, 13:07
Вы бы, лучше, написали что требуется сделать и что не работает. А так, не думаю что кто-то ответит.

Автор: artmel 27.11.2015, 14:18
это алгоритм расчета контрольной суммы.
нужно его написать на пхп. 
смысл в том что я не могу понять сам алгоритм. если бы я понял что там, то на пхп я и сам бы переписал.

Автор: ksnk 27.11.2015, 16:11
Что там непонятного-то?  smile 
checksum_areas - массив из структур такого состава {addr_start:XXX,addr_end:XXX,checksum_value:XXX}. Соответственно
checksum_areas[i].addr_start - выковырять значение нужного поля структуры.

checksum_areas[i].addr_start %4 - получить остаток от деления числа на 4. Это точно Сишник писал? Лучше было бы пару последних битов взять.

А вот адресной арифметики в PHP нету, пичалька...

Автор: artmel 27.11.2015, 17:12
Спасибо!

к сожалению не хватает постов плюсик в репутацию добавить.
 я не знаю кто это написал, иначе бы просто спросил у него.



вроде разобрался, кроме  что такое *addr;
почему стоит звездочка?

Автор: ksnk 27.11.2015, 23:12
Цитата(artmel @  27.11.2015,  17:12 Найти цитируемый пост)
вроде разобрался, кроме  что такое *addr

Это С. В переменной addr располагается адрес памяти; конструкция *addr представляет собой значение в памяти по тому адресу. Это как раз та штука, которой и нет в php.

Что за задача-то решается?

Автор: artmel 28.11.2015, 09:47
Спасибо!
у меня это (значение по адресу) выполняет отдельно написанная функция.

Так я написал, расчитывается контрольная сумма файла.
По итогу похоже просто сложение 32битных чисел.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)