phpbar.de logo

Mailinglisten-Archive

[php] Funktion zur Hexumwandlung von C nach PHP portieren

[php] Funktion zur Hexumwandlung von C nach PHP portieren

Sebastian Mendel lists at sebastianmendel.de
Mit Apr 2 15:48:51 CEST 2008


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