Frage

So habe ich diese c # Anwendung, die meine Web-Server, das ist läuft Linux / PHP-Stack ping muss.
Ich habe Probleme mit der c # Art und Weise von Base 64-Codierung Bytes.

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, dies zu c # gebührt ‚+‘ s in der Codierung Hinzufügen aber nicht sicher. Anhaltspunkte

War es hilfreich?

Lösung

Sie sollten wahrscheinlich die Base64-String auf der C # Seite URL Encode, bevor Sie es senden.

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

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);

Andere Tipps

Beachten Sie, dass + ein gültiges Zeichen in Base64-Codierung, aber wenn in URLs verwendet wird, ist es oft wieder in einen Raum übersetzt. Dieser Raum kann Ihre PHP base64_decode Funktion verwirrend.

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

  • Use% -encoding das Zeichen + zu kodieren, bevor sie Ihre C # Anwendung verlässt.
  • In Ihrer PHP-Anwendung, übersetzen Leerzeichen bis + zurück, bevor base64_decode vorbei.

Die erste Option ist wahrscheinlich die bessere Wahl.

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

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;

}

Convert.ToBase64String scheint nichts extra weit hinzufügen, wie 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 enthält nichts, was enc auf der C # Seite hat -. Überprüfen sie gegeneinander

in c #

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

verwandelt sich in

dGhpcyBpcyBhIDxCPmxvbmc8L2I+c3RyaW5nLiBhbmQgbGV0cyBtYWtlIHRoaXMgYTMyMTQgYWQwLTMyMTQgMGN6Y3ggOTA5MzQwIHp4Y2kgMDMyNCMkQCMkJSUxMzI0NDUxMzEyMw==

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

Die PHP-Seite sollte sein: $ Data = $ _REQUEST [ 'in']; // $ decdata = urldecode ($ data); $ Raw = base64_decode ($ decdata);

Das $ _REQUEST sollte bereits URLdecoded werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top