Domanda

Quindi ho questa applicazione c # che deve eseguire il ping del mio server Web che esegue stack Linux / PHP.
Sto riscontrando problemi con il modo c # dei byte di codifica base 64.

il mio codice c # è simile a:

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

e lato php:

$data = 

Quindi ho questa applicazione c # che deve eseguire il ping del mio server Web che esegue stack Linux / PHP.
Sto riscontrando problemi con il modo c # dei byte di codifica base 64.

il mio codice c # è simile a:

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

e lato php:

<*>

con stringhe più grandi oltre 100 caratteri non riesce. Penso che ciò sia dovuto al fatto che c # aggiunge '+' nella codifica ma non ne sono sicuro. eventuali indizi

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

con stringhe più grandi oltre 100 caratteri non riesce. Penso che ciò sia dovuto al fatto che c # aggiunge '+' nella codifica ma non ne sono sicuro. eventuali indizi

È stato utile?

Soluzione

Probabilmente dovresti URL codificare la tua stringa Base64 sul lato C # prima di inviarla.

E l'URL lo decodifica sul lato php prima della decodifica base64.

Lato C #

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

e lato php:

$data = 

Probabilmente dovresti URL codificare la tua stringa Base64 sul lato C # prima di inviarla.

E l'URL lo decodifica sul lato php prima della decodifica base64.

Lato C #

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

e lato php:

<*>REQUEST['in']; $decdata = urldecode($data); $raw = base64_decode($decdata);

Altri suggerimenti

Nota che + è un carattere valido nella codifica base64, ma quando usato negli URL viene spesso tradotto in uno spazio. Questo spazio potrebbe confondere la tua funzione PHP base64_decode .

Hai due approcci per risolvere questo problema:

  • Utilizza% -encoding per codificare il carattere + prima che lasci l'applicazione C #.
  • Nell'applicazione PHP, ritrasforma i caratteri dello spazio in + prima di passare a base64_decode.

La prima opzione è probabilmente la scelta migliore.

Sembra funzionare, sostituendo + con% 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 non sembra aggiungere nulla in più per quanto posso vedere. Ad esempio:

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

Il codice sopra riportato stampa un carico di AAAA con == alla fine, che è corretto.

La mia ipotesi è che $ data sul lato PHP non contenga ciò che enc ha fatto sul lato C #: controllali uno contro l'altro.

in c #

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

si trasforma in

dGhpcyBpcyBhIDxCPmxvbmc8L2I+c3RyaW5nLiBhbmQgbGV0cyBtYWtlIHRoaXMgYTMyMTQgYWQwLTMyMTQgMGN6Y3ggOTA5MzQwIHp4Y2kgMDMyNCMkQCMkJSUxMzI0NDUxMzEyMw==

per me. e penso che + stia rompendo tutto.

Il lato PHP dovrebbe essere: $ data = $ _REQUEST ['in']; // $ decdata = urldecode ($ data); $ raw = base64_decode ($ decdata);

$ _REQUEST dovrebbe già essere codificato URL.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top