phpjs: PHP vs. JavaScript Funktion - kleiner Unterschied

Hi,

nun habe ich einmal eine decode Funktion mit JS und daraufhin mit PHP verfasst.
Die mit Javascript arbeitet korrekt und obwohl diese eigentlich das selbe tut wie die PHP Funktion, muss ich feststellen, dass bei PHP im Beispiel der erste Wert falsch ist; die anderen stimmen.

Seht Ihr einen Unterschied, der dieses Verhalten erklärt?

Vielen Dank für nen Tipp.

  
<script>  
// !6D496= |:4926=  
// Peschel Michael  
// KORREKT!  
var characterMap = new Array();  
var characterSet = "!\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";  
for (i = 0; i < characterSet.length; i++) {  
    characterMap[characterSet.charAt(i)] = characterSet.charAt( (i + 47) % 94 );  
}  
function decode47(text) {  
    toReturn = '';  
    for (i = 0; i < text.length; i++) {  
        currentChar = text.charAt(i);  
        if (currentChar >= '!' && currentChar <= '~') {  
	    toReturn += characterMap [currentChar];  
        } else {  
            toReturn += currentChar  
        }  
    }  
  
    return toReturn;  
}  
alert(decode47('!6D496= |:4926='));  
</script>  
  
[code lang=php]  
<?  
// !6D496= |:4926=  
// Peschel Michael  
// ABER: Oeschel Michael  
$characterSet = "!\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";  
echo($characterSet)."<br>";  
for ($i = 0; $i < strlen($characterSet); $i++)  
{  
    $characterMap[$characterSet[$i]] = $characterSet[(($i+47)%94)];  
}  
function decode47($text)  
{  
	GLOBAL $characterMap,$characterSet;  
	$toReturn = '';  
	for ($i = 0; $i < strlen($text); $i++) {  
	$currentChar = $text[$i];  
	if ($characterMap[$currentChar]) {  
		$toReturn .= $characterMap [$currentChar];  
	} else {  
		$toReturn .= $currentChar;  
	}  
	}  
	return $toReturn;  
}  
echo decode47('!6D496= |:4926=');  
?>

[/code]

  1. Liebe(r) phpjs,

    $currentChar = $text[$i];

    also ich hätte hier eher sowas erwartet:
    $currentChar = substr($text, $i, 1);
    oder auch
    $currentChar = $text{$i, 1};
    Keine Ahnung, ob das etwas zu sagen hat.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hi!

      `$currentChar = $text[$i];`{:.language-php}  
      

      also ich hätte hier eher sowas erwartet:

      Das ist richtig so. Siehe String access and modification by character.

      Lo!

  2. Hi!

    Seht Ihr einen Unterschied, der dieses Verhalten erklärt?

    PHP hat etwas andere Regeln für die Stringnotation als Javascript. Du lässt dir zwar $characterSet ausgeben (was du vermutlich wegen nicht beachtetem Kontextwechsel zu HTML ohne HTML-spezifische Behandlung machst - Stichwort htmlspecialchars()), schaust aber anscheinend nicht genau hin.

    Vielen Dank für nen Tipp.

    Das erste Zeichen im "verschlüsselten" String liegt vor dem ' alle anderen dahinter.

    Außerdem ist bei dem folgenden Code-Ausschnitt die erste Zeile falsch:

    if ($characterMap[$currentChar]) {
                  $toReturn .= $characterMap [$currentChar];
          } else {
                  $toReturn .= $currentChar;
          }

    Sie erzeugt nicht nur eine Notice, wenn du das error_reporting auf E_ALL stehen hättest. Ein Unterstrich im verschlüsselten Wert sollte zu 0 auflösen, doch diese Zeile ergibt false, weswegen er nicht dekodiert wird. Du prüfst nicht, ob $characterMap[$currentChar] existiert (dafür wäre isset() geeigneter), sondern testest das Ausdrucksergebnis auf einen boolschen Wert. Ein String mit dem Inhalt 0 ergibt false aufgrund PHPs eingebauter Typumwandlung ('_' => '0').

    Lo!

  3. Hi,

    $characterSet = "!"#$%&'()*+,-./0123456789:;

    <=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~";

    richtig wäre:

    $characterSet = "!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~";

    Viel Spaß