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:
Diese habe ich in PHP wie folgt geschrieben:
Wenn ich diese Funktion nun mit dem Secret Key durchlaufe:
dann erhalte ich bei beiden Varianten das gewünschte Ergebnis:
Lasse ich nun aber diesen Key durchlaufen
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
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
- private string RegisterCharPool(string key)
- {
- Dictionary<char, int> k = new Dictionary<char, int>();
- int a = 0, l = 0, d = 0, c = 0, h = key.Length, b;
- string charPool = "";
- for (a = 0; 64 > a; a++)
- {
- k.Add("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[a], a);
- }
- for (d = 0; d < h; d++)
- {
- char index = key[d];
- for (a = (k.ContainsKey(index) ? k[index] : 0), l = (l << 6) + a, c += 6; 8 <= c;)
- {
- c -= 8;
- b = l >> c & 255;
- if (b != 0 || d < h - 2)
- charPool += (char)(b);
- }
- }
- Console.WriteLine(charPool);
- return charPool;
- }
Diese habe ich in PHP wie folgt geschrieben:
PHP-Quellcode
- private function RegisterCharPool($key){
- $k = array();
- $a = 0;
- $l = 0;
- $d = 0;
- $c = 0;
- $h = strlen($key);
- $b;
- $charPool = "";
- for($a = 0; 64 > $a; $a++) {
- $k["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[$a]] = $a;
- }
- for($d = 0 ; $d < $h; $d++) {
- $index = $key[$d];
- for($a = (isset($k[$index]) ? $k[$index] : 0), $l = ($l << 6) + $a, $c += 6; 8 <= $c;) {
- $c -= 8;
- $b = $l >> $c & 255;
- if($b != 0 || $d < $h - 2) {
- $charPool .= chr($b);
- }
- }
- }
- return $charPool;
- }
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