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