2008-11-02 3 views
9

So habe ich diese C# -Anwendung, die meinen Webserver pingt, der Linux/php Stapel laufen lässt.
Ich habe Probleme mit der C# -Way von Basis 64 Codierung Bytes.C# zu PHP base64 kodieren/decodieren

mein C# -Code ist wie:

byte[] encbuff = System.Text.Encoding.UTF8.GetBytes("the string"); 
String enc = Convert.ToBase64String(encbuff); 

und PHP-Seite:

$data = $_REQUEST['in']; 
$raw = base64_decode($data); 

mit größeren Strings 100+ verkohlt es funktioniert nicht. Ich denke, das liegt an C# Hinzufügen von '+' s in der Codierung, aber nicht sicher. alle Hinweise

+0

Excuse meiner Unwissenheit, ist es notwendig, base64 vor der Übertragung einen UTF8-String kodieren? Ich kann sehen, dass Sie möglicherweise URL codieren müssen. – Jodrell

Antwort

14

Sie sollten wahrscheinlich URL codieren Ihre Base64-Zeichenfolge auf der C# -Seite, bevor Sie es senden.

Und URL Decode es auf der PHP-Seite vor der base64-Decodierung.

C# Seite

byte[] encbuff = System.Text.Encoding.UTF8.GetBytes("the string"); 
string enc = Convert.ToBase64String(encbuff); 
string urlenc = Server.UrlEncode(enc); 

und PHP-Seite:

$data = $_REQUEST['in']; 
$decdata = urldecode($data); 
$raw = base64_decode($decdata); 
1

Convert.ToBase64String scheint nichts hinzuzufügen, soweit ich sehen kann. Zum Beispiel:

byte[] bytes = new byte[1000]; 
Console.WriteLine(Convert.ToBase64String(bytes)); 

Der obige Code gibt am Ende eine Last von AAAAs mit == aus, was richtig ist.

Meine Vermutung ist, dass $data auf der PHP-Seite nicht enthält, was enc auf der C# -Seite getan hat - überprüfen Sie sie gegeneinander.

7

Beachten Sie, dass + ein gültiges Zeichen in Base64-Codierung ist, aber wenn es in URLs verwendet wird, wird es oft in ein Leerzeichen zurückübersetzt. Dieser Platz kann Ihre PHP base64_decode Funktion verwirren.

Sie haben zwei Ansätze zur Lösung dieses Problems:

  • Use% -encoding das Zeichen + zu kodieren, bevor sie Ihre C# Anwendung verlässt.
  • Konvertieren Sie in Ihrer PHP-Anwendung Leerzeichen zurück in +, bevor Sie sie an base64_decode übergeben.

Die erste Option ist wahrscheinlich Ihre bessere Wahl.

+0

danke. ja, das war das Problem in der URL. tat so etwas. Affe hackt FTW Zeichenfolge enc = Convert.ToBase64String (encbuff) .Replace ("+", "===="); und $ raw = str_replace ("====", "+", $ roh); –

+1

Nun, das ist eine Möglichkeit, das zu tun. Was ich vorschlug, war das Ersetzen von "+" durch "% 2B" in der C# -Anwendung, dann müssen Sie in der PHP-Anwendung überhaupt nichts mehr tun. –

0

in C#

this is a <B>long</b>string. and lets make this a3214 ad0-3214 0czcx 909340 zxci 0324#[email protected]#$%%13244513123 

verwandelt sich in

dGhpcyBpcyBhIDxCPmxvbmc8L2I+c3RyaW5nLiBhbmQgbGV0cyBtYWtlIHRoaXMgYTMyMTQgYWQwLTMyMTQgMGN6Y3ggOTA5MzQwIHp4Y2kgMDMyNCMkQCMkJSUxMzI0NDUxMzEyMw== 

für mich. und ich denke, dass + alles bricht.

0

Das sollte PHP Seite sein: = $ data $ _REQUEST [ 'in']; // $ decdata = URL-Code ($ Daten); $ rohe = base64_decode ($ decdata);

Der $ _REQUEST sollte bereits URLdecodiert sein.

3

Dies scheint zu funktionieren, 2B + mit% ersetzen ...

private string HTTPPost(string URL, Dictionary<string, string> FormData) 
{ 

    UTF8Encoding UTF8encoding = new UTF8Encoding(); 
    string postData = ""; 

    foreach (KeyValuePair<String, String> entry in FormData) 
    { 
      postData += entry.Key + "=" + entry.Value + "&"; 
    } 

    postData = postData.Remove(postData.Length - 1); 

    //urlencode replace (+) with (%2B) so it will not be changed to space () 
    postData = postData.Replace("+", "%2B"); 

    byte[] data = UTF8encoding.GetBytes(postData); 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); 

    request.Method = "POST"; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.ContentLength = data.Length; 

    Stream strm = request.GetRequestStream(); 
    // Send the data. 
    strm.Write(data, 0, data.Length); 
    strm.Close(); 

    WebResponse rsp = null; 
    // Send the data to the webserver 
    rsp = request.GetResponse(); 

    StreamReader rspStream = new StreamReader(rsp.GetResponseStream()); 
    string response = rspStream.ReadToEnd(); 

    return response; 

}