PHP Bitverschiebung

  • PHP

    PHP Bitverschiebung

    Hallo zusammen,

    Ich bin gerade dabei eine Library von C# nach PHP zu übersetzen. Dabei habe ich ein Problem mit der Bitverschiebung in PHP.

    Ich habe folgende C# Funktion:

    C#-Quellcode

    1. private string RegisterCharPool(string key)
    2. {
    3. Dictionary<char, int> k = new Dictionary<char, int>();
    4. int a = 0, l = 0, d = 0, c = 0, h = key.Length, b;
    5. string charPool = "";
    6. for (a = 0; 64 > a; a++)
    7. {
    8. k.Add("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[a], a);
    9. }
    10. for (d = 0; d < h; d++)
    11. {
    12. char index = key[d];
    13. for (a = (k.ContainsKey(index) ? k[index] : 0), l = (l << 6) + a, c += 6; 8 <= c;)
    14. {
    15. c -= 8;
    16. b = l >> c & 255;
    17. if (b != 0 || d < h - 2)
    18. charPool += (char)(b);
    19. }
    20. }
    21. Console.WriteLine(charPool);
    22. return charPool;
    23. }


    Diese habe ich in PHP wie folgt geschrieben:

    PHP-Quellcode

    1. private function RegisterCharPool($key){
    2. $k = array();
    3. $a = 0;
    4. $l = 0;
    5. $d = 0;
    6. $c = 0;
    7. $h = strlen($key);
    8. $b;
    9. $charPool = "";
    10. for($a = 0; 64 > $a; $a++) {
    11. $k["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[$a]] = $a;
    12. }
    13. for($d = 0 ; $d < $h; $d++) {
    14. $index = $key[$d];
    15. for($a = (isset($k[$index]) ? $k[$index] : 0), $l = ($l << 6) + $a, $c += 6; 8 <= $c;) {
    16. $c -= 8;
    17. $b = $l >> $c & 255;
    18. if($b != 0 || $d < $h - 2) {
    19. $charPool .= chr($b);
    20. }
    21. }
    22. }
    23. return $charPool;
    24. }


    Wenn ich diese Funktion nun mit dem Secret Key durchlaufe:
    TT18WlV5TXVeLXFXYn1WTF5qSmR9TXYpOHklYlFXWGY+SUZCRGNKPiU0emcyQ2l8dGVsamBkVlpA

    dann erhalte ich bei beiden Varianten das gewünschte Ergebnis:
    M=|ZUyMu^-qWb}VL^jJd}Mv)8y%bQWXf>IFBDcJ>%4zg2Ci|telj`dVZ@

    Lasse ich nun aber diesen Key durchlaufen
    p4MNZY0bvW4V7TtFMPV2MaYXKBcg8x+1n5O0aXsu8TrhGz0wdsei+3gmCcUQpsJzWX6GCPKthcfqrMZSh472H2OYX/gBfLUb6YGx1VoVqdU062oqSoyFR0gF6trheoYcmGorbVc6c/AsGXEa

    dann weicht mein Endergebnis minimal ab.


    Zeile 1 ist das falsche Ergebnis. Richtig wäre Zeile 3 und 4 kombiniert. Ich habe die falschen stellen mal markiert. Das Problem ist, das PHP einen Zeilenumbruch und eine Tabeinrückung als Leerzeichen einträgt. Dadurch stimmt nun mein Charpool aber nicht mehr.

    Hat Jemand einen Ratschlag für mich, wie ich dieses verhalten unterbinde?

    LG Marvin