Mailinglisten-Archive |
Hallo zusammen, bei meinem basteln an der eigenen base64_decode funktion habe ich ein paar verschiedene implementierungen ausprobiert und dabei interessante Ergebnisse erzielt: Im Prinzip geht es darum aus einem Character eine Zahl (0..63) zu machen und damit dann die Daten per Bitrotation etc. aus 6 Bit in 8 Bit zu wandeln. Knackpunkt ist unter anderem die Umsetzung des Characters in die Zahl. Variante 1: ----------- $code64='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; ... $x=strpos($code64,$text{$i}); if (!($x===false)) { ... } Variante 2: ----------- $code64=Array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P ', 'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f', 'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', 'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'); $code64=array_flip($code64); ... $ch=$text{$i}; if (array_key_exists($ch,$code64)) { $x=$code64[$ch]; ... } Variante 3: ----------- $x=ord($text{$i}); if (($x>=65) && ($x<=90)) { $x-=65; } else if (($x>=97) && ($x<=122)) { $x-=71; } else if (($x>=48) && ($x<=57)) { $x+=4; } else if ($x==43) { $x=62; } else if ($x==47) { $x=63; } else { $x=-1; } if ($x>-1) { ... } Was glaubt ihr welche Variante schneller ist? Dazu muss man sagen in Variante 1 und 2 die Strinzuweisung bzw. Array Erzeugung und Flip nur einmal ausgeführt wird und der Rest in Schleife für den gesamten Base64 Datenblock. Bin mal gespannt was ihr tippt :-) Gruß, Andreas
php::bar PHP Wiki - Listenarchive