Also mit PHP selbst kann ich deinen Base64-String einwandfrei dekodieren. Ok es kommen ein paar nicht darstellbare Zeichen raus, aber das ist durchaus üblich.
Wenn ich mit PHP den String dekodiere und wieder encodiere bekomme ich folgenden String: QCgPCFbQS1aYS16MC05Xy1dKSh6dXNhbW1lbmFyYmVpdCgOsKgfCZuYnNwO3xbXHMsJ 10pK21pdCgOsKgfCZuYnNwO3xbXHMsJ10pK2xpbmtsaWZ0KSgIVtBLVphLXowLTlfLV0pQGk=
Es ist ein ähnlicher String, da die Unterstriche entfernt sind und ein = am Ende hinzugekommen ist. Evtl. hat die Anzahl der Unterstriche entwas mit der Anzahl der = am Ende zu tun?
Ahh ich habs: RFC 3548 beschreibt ebenfalls diese Kodierung, schlägt allerdings eine leicht modifizierte Variante vor, welche benutzt werden soll, falls die Zeichen + und / nicht angewendet werden können. (Zum Beispiel bei Dateinamen oder anderen Umgebungen, wo diese Zeichen eine Sonderbedeutung haben.) Diese Zeichen werden durch - (Minus, ASCII 2Dhex) und _ (Unterstrich, ASCII 5Fhex) ersetzt
Der Ursprungswert war also: QCg/PCFbQS1aYS16MC05Xy1dKSh6dXNhbW1lbmFyYmVpdCg/OsKgfCZuYnNwO3xbXHMsJ10pK21pdCg/OsKgfCZuYnNwO3xbXHMsJ10pK2xpbmtsaWZ0KSg/IVtBLVphLXowLTlfLV0pQGk
und decodiert dann: @(?<![A-Za-z0-9_-])(zusammenarbeit(?:Â | |[\s,'])+mit(?:Â | |[\s,'])+linklift)(?![A-Za-z0-9_-])@i
Der Base64 String stimmt nun allerdings nicht in der Länge, da laut RFC das "=" am Ende entfernt werden darf. Doch woher wissen wir, ob eins hin muß oder nicht? Nunja die Länge eines Base64 Strings muß immer durch 4 teilbar sein.
Womit wir dann zu folgendem Quellcode kommen in C#:
// Url String string base64UrlEncodedText = "QCg_PCFbQS1aYS16MC05Xy1dKSh6dXNhbW1lbmFyYmVpdCg_OsKgfCZuYnNwO3xbXHMsJ10pK21pdCg_OsKgfCZuYnNwO3xbXHMsJ10pK2xpbmtsaWZ0KSg_IVtBLVphLXowLTlfLV0pQGk"; // ersetze Minus und Unterstrich string base64EncodedText = base64UrlEncodedText.Replace('-', '+').Replace('_', '/'); // hänge evtl. ein Istgleich an, wenn kein volles Quartett base64EncodedText = base64EncodedText.PadRight(base64EncodedText.Length + (4 - base64EncodedText.Length % 4) % 4, '=');
Console.WriteLine(base64EncodedText);
// Entschlüsselung byte[] text = Convert.FromBase64String(base64EncodedText); // byte[] to String System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); Console.WriteLine(enc.GetString(text));
habe mal ein wenig gesucht und in der MSDN was gefunden, was deinen Verdacht bestätigt:
(string) besteht aus Base-64-Ziffern, Leerraumzeichen und nachfolgenden Füllzeichen. Die Base-64-Ziffern sind in von 0 (null) aufsteigender Reihenfolge die Großbuchstaben 'A' bis 'Z', die Kleinbuchstaben 'a' bis 'z', die Ziffern '0' bis '9' und die Zeichen '+' und '/'.
Zu den Leerraumzeichen (mit Unicode-Namen und hexadezimalem Codepunkt) zählen die folgenden: Tabstoppzeichen (CHARACTER TABULATION, U+0009), Zeilenumbruch (LINE FEED, U+000A), Wagenrücklauf (CARRIAGE RETURN, U+000D) und Leerzeichen (SPACE, U+0020). In s kann eine beliebige Anzahl von Leerraumzeichen enthalten sein, da diese ignoriert werden.
Das wertfreie Zeichen '=' wird für nachfolgende Füllzeichen verwendet. Das Ende von s kann aus keinem, einem oder zwei Füllzeichen bestehen.
Sprich, um genau zu sein, hast du nur die folgenden Zeichen zur Verfügung:
Ich denke mal, du kommst nicht drum rum, die Unterstriche zu ersetzen. Dafür kannst du ja Leerraumzeichen oder Füllzeichen benutzen. Hier noch der Link zur MSDN-Hilfe:
Du kannst solche Sachen prima online verifizieren, z.B. hier. Teste ich dort mit 'hallo' -> 'aGFsbG8=' -> ändern in 'aGF_sbG8=' -> 'hallo' so sagt mir das, dass die '_' in Deinen Eingangsdaten falsch sind, aber einfach rausgestrichen werden können. Also:
string encoded = "aGF_sbG8="; encoded = encoded.Replace("_",""); // besser: mit regex alle nicht erlaubten zeichen entfernen string decoded = Convert.FromBase64String(encoded);