Question

J'ai donc cette application c # qui doit envoyer une requête ping à mon serveur Web qui exécute une pile linux / php.
J'ai des problèmes avec le chemin C # des octets de codage en base 64.

mon code c # ressemble à:

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

et côté php:

$data = 

J'ai donc cette application c # qui doit envoyer une requête ping à mon serveur Web qui exécute une pile linux / php.
J'ai des problèmes avec le chemin C # des octets de codage en base 64.

mon code c # ressemble à:

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

et côté php:

<*>

avec des chaînes plus grandes 100+ caractères il échoue. Je pense que cela est dû à l'ajout de '+' dans l'encodage mais pas sur. des indices

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

avec des chaînes plus grandes 100+ caractères il échoue. Je pense que cela est dû à l'ajout de '+' dans l'encodage mais pas sur. des indices

Était-ce utile?

La solution

Vous devriez probablement utiliser un URL pour encoder votre chaîne Base64 du côté C # avant de l'envoyer.

Et l'URL le décoder côté php avant de le décoder en base64.

Côté C #

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

et côté php:

$data = 

Vous devriez probablement utiliser un URL pour encoder votre chaîne Base64 du côté C # avant de l'envoyer.

Et l'URL le décoder côté php avant de le décoder en base64.

Côté C #

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

et côté php:

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

Autres conseils

Notez que + est un caractère valide dans le codage en base64, mais lorsqu'il est utilisé dans des URL, il est souvent traduit en espace. Cet espace peut prêter à confusion pour votre fonction PHP base64_decode .

Vous avez deux approches pour résoudre ce problème:

  • Utilisez le codage% pour coder le caractère + avant qu'il ne quitte votre application C #.
  • Dans votre application PHP, convertissez les espaces en + avant de passer à base64_decode.

La première option est probablement votre meilleur choix.

Cela semble fonctionner, en remplaçant + par% 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 ne semble rien ajouter de plus, à ma connaissance. Par exemple:

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

Le code ci-dessus imprime une charge d'AAAA avec == à la fin, ce qui est correct.

Je suppose que $ data du côté de PHP ne contient pas ce que enc a fait du côté C # - vérifiez-les l'un contre l'autre.

dans c #

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

se transforme en

dGhpcyBpcyBhIDxCPmxvbmc8L2I+c3RyaW5nLiBhbmQgbGV0cyBtYWtlIHRoaXMgYTMyMTQgYWQwLTMyMTQgMGN6Y3ggOTA5MzQwIHp4Y2kgMDMyNCMkQCMkJSUxMzI0NDUxMzEyMw==

pour moi. et je pense que + est en train de tout casser.

Le côté PHP devrait être: $ data = $ _REQUEST ['in']; // $ decdata = urldecode ($ data); $ raw = base64_decode ($ decdata);

Le $ _REQUEST devrait déjà être URLdecoded.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top