Linux за българи: Форуми

Програмиране => Web development => Темата е започната от: bohosh в Feb 23, 2014, 10:53



Титла: Алгоритъм от Python в PHP.
Публикувано от: bohosh в Feb 23, 2014, 10:53
Нуждая се от човек с познания от Python и PHP за да можем един алгоритъм да го направим от Python в php. Става въпрос за алгоритъм за смятане на 16 битова чексума.
За желаещите да помогнат или предложат оферта, моля пишете тук или на лично.

Благодаря.

def readn(fin, n):
s = 0
for ti in fin.read(n):
s = s * 256 + ord(ti)
return s

def fletcher(fin, k):
if k not in (16, 32, 64):
raise ValueError("Valid choices of k are 16, 32 and 64")
nbytes = k // 16
mod = 2 ** (8 * nbytes) - 1
s = s2 = 0
t = readn(fin, nbytes)
while t:
s += t
s2 += s
t = readn(fin, nbytes)
return s % mod + (mod + 1) * (s2 % mod)


Титла: Re: Алгоритъм от Python в PHP.
Публикувано от: gat3way в Feb 23, 2014, 11:56
Код:
debian:/tmp# cat a.py 
def readn(fin, n):
    s = 0
    for ti in fin.read(n):
        s = s * 256 + ord(ti)
    return s

def fletcher(fin, k):
    if k not in (16, 32, 64):
        raise ValueError("Valid choices of k are 16, 32 and 64")
    nbytes = k // 16
    mod = 2 ** (8 * nbytes) - 1
    s = s2 = 0
    t = readn(fin, nbytes)
    while t:
        s += t
        s2 += s
        t = readn(fin, nbytes)
    return s % mod + (mod + 1) * (s2 % mod)

def main():
    fin = open("/tmp/a.py","r")
    print fletcher(fin,16)

if __name__ == "__main__":
    main()
debian:/tmp# python a.py
55692
debian:/tmp# cat a.php
<?php

function readn($fin,$n)
{
    $s = 0;
    $arr = fread($fin,$n);
    if (!strlen($arr)) return 0;
    for ($a=0;$a<$n;$a++)
    {
        $s = ($s << 8) + ord($arr[$a]);
    }
    return $s;
}

function fletcher($fin,$k)
{
    if (($k!=16) && ($k!=32) && ($k!=64)) die("Valid choices of k are 16/32/64");
    $nbytes = floor($k/16);
    $mod = (1 << ($nbytes<<3)) -1;
    $s = $s2 = 0;
    $t = readn($fin,$nbytes);
    while ($t)
    {
        $s+=$t;
        $s2+=$s;
        $t = readn($fin,$nbytes);
    }
    return $s % $mod + ($mod+1)*($s2%$mod);
}

$fin = fopen("/tmp/a.py","r");
echo fletcher($fin,16);
?>

debian:/tmp# php a.php
55692

Не ща пари, бири, кафета и тем подобни. Искам да разбера защо точно fletcher за чексуми на файлове.


Титла: Re: Алгоритъм от Python в PHP.
Публикувано от: bohosh в Feb 23, 2014, 14:56
След като ми дадоха грешна информация...темата доста се промени!!!
Ако някой има идея от смятане на чексуми в HEX файлове, нека пише.
Благодаря.


Титла: Re: Алгоритъм от Python в PHP.
Публикувано от: gat3way в Feb 23, 2014, 18:45
Защо не пробваш със стандартната CRC функция в PHP? Ако е защото fletcher е по-бърз, то имай предвид че точно тази имплементация е отвратително бавна, защото ще чете по 2/4 или 8 байта от файла. Ще трябва да я оптимизираш като четеш по-големи блокове от файла и ги буферираш. Трябва да има някакво предимство в конкретния случай, което да оправдае заниманието, та ми страна интересно.