Mailinglisten-Archive |
das ist eher eine CRC Funktion, hättest du vielleicht erwähnen sollen, dann hätte vielleicht mehr was dazu sagen können ... Alex Haeussel schrieb: > Hallo Liste, > > ich hatte mich letzte Woche schon einmal an euch gewendet, da ich einen > fremden C++-Code in PHP umsetzen muss aber leider mit der Bedeutung des > C-Codes schon nicht zurecht kam. > Mittlerweile habe ich mit dem Herstller telefoniert und auch die Funktion in > PHP umgesetzt. Leider gibt es noch eine kleine Unstimmigkeit in der > Konvertierung in einen Hexwert > Hier ist noch einmal die Funktion in C++: > > void sum_add(ulong* sum, const char* str) { > size_t len=strlen(str); > for(size_t i=0; i<len; i++) { > *sum = (*sum + ((ulong)str[i] * ((i+1)<<4))) % 0x10000; > } > } > > Meine Funktion in PHP: > function sum_add($sum, $str){ > $len = strlen($str); > for ($i=0; $i < $len; $i++){ > $sum = $sum + ((ord($str[$i]) * (($i+1) << 4)) & 0xffffffff ); > } > return($sum); > } > > Die Modulo-Operation in C dient lediglich der Umwandlung in Hex und fällt > hier weg. > Zum Vergleich ob die Funktion richtig arbeitet gibt es ein Beispiel des > Herstellers. > Ich habe mir nach jedem Aufruf der Funktion den Wert per dechex() Ausgeben > lassen. > Der Kommentar hinter dem Aufruf von sum_add() zeigt was raus kommen soll und > der Kommentar nach dem dechex() zeigte was bei mir raus kommt. > Bis zum 4 Aufruf ist auch alles richtig, danach steht aber immer an erster > Stelle ein Wert der da irgendwie nicht hin gehört. > (1fe20 statt fe20) in C macht das die Stelle "% 0x10000" sprich: schneide alles ab was größer 0x10000 ist, also 1fe20 > fe20 in PHP funktioniert das genauso, deine Klammern sind nur falsch! $sum = ($sum + (ord($str[$i]) * (($i + 1) << 4)) & 0xffffffff; und dein +xfff.. ist falsch probier mal: $sum = ($sum + (ord($str[$i]) * (($i + 1) << 4)) % 0x10000; -- Sebastian
php::bar PHP Wiki - Listenarchive