phpbar.de logo

Mailinglisten-Archive

[php] Funktion zur Hexumwandlung von C nach PHP portieren

[php] Funktion zur Hexumwandlung von C nach PHP portieren

Alex Haeussel php at haeussel.net
Mit Mar 26 14:18:42 CET 2008


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)

Mein Beispiele:

$sum = sum_add($sum, ""); // "Stop" param, sum is 0 after this operation
echo dechex($sum)."<br>";

$sum = sum_add($sum, ""); // "Scope" param, sum is 0 after this operation
echo dechex($sum)."<br>";

$sum = sum_add($sum, "Dr.X"); // User id, sum is 0x00003120
echo dechex($sum)."<br>"; // 3120

$sum = sum_add($sum, "1065507963"); // Time stamp, sum is 0x0000e6f0
echo dechex($sum)."<br>"; // e6f0

$sum = sum_add($sum, "12121212-1212"); // Patient id, sum is 0x0000fe20
echo dechex($sum)."<br>";  // 1fe20

$sum = sum_add($sum, "1234^2345"); // Accession numbers, sum is 0x00009c40
echo dechex($sum)."<br>";  // 29c40

$sum = sum_add($sum, "001^001"); // Exam numbers, sum is 0x0000fc60
echo dechex($sum)."<br>"; // 2fc60

$sum = sum_add($sum, "test"); // System password, sum is 0x000042d0
echo dechex($sum)."<br>"; // 342d0

Kann mir da jemand weiter helfen was an der Stelle falsch läuft? Ich habe
schon auf php.net nachgeschaut und auch schon den Trick mit dem typecast
probiert und dem +0 ( dechex((float)$sum + 0) )
Aber auch das bleibt ohne Erfolg.

Grüße und danke im Voraus.

Alex




php::bar PHP Wiki   -   Listenarchive