سؤال

لذلك لدي تطبيق c# الذي يحتاج إلى اختبار اتصال خادم الويب الخاص بي الذي يعمل بنظام التشغيل Linux/php.
أواجه مشاكل مع طريقة c# للتشفير الأساسي 64 بايت.

رمز C# الخاص بي يشبه:

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

والجانب PHP:

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

مع سلاسل أكبر تزيد عن 100 حرف، فإنها تفشل.أعتقد أن هذا يرجع إلى إضافة c# لعلامة "+" في الترميز ولكني لست متأكدًا.أي أدلة

هل كانت مفيدة؟

المحلول

وربما يجب عليك URL ترميز سلسلة ل Base64 على C # الجانب قبل إرسالها.

وURL فك شفرة على الجانب فب قبل base64 في فك ذلك.

وC # الجانب

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

ووالجانب فب:

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

نصائح أخرى

لاحظ أن + هو حرف صالح في تشفير base64، ولكن عند استخدامه في عناوين URL، غالبًا ما تتم ترجمته مرة أخرى إلى مسافة.قد تكون هذه المساحة مربكة لـ PHP الخاص بك base64_decode وظيفة.

لديك طريقتان لحل هذه المشكلة:

  • استخدم %-encoding لتشفير الحرف + قبل أن يغادر تطبيق C# الخاص بك.
  • في تطبيق PHP الخاص بك، قم بترجمة أحرف المسافة مرة أخرى إلى + قبل المرور إلى base64_decode.

ربما يكون الخيار الأول هو خيارك الأفضل.

ويبدو أن هذا العمل، لتحل محل + مع٪ 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 لإضافة أي شيء إضافي بقدر ما أستطيع أن أرى. على سبيل المثال:

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

ورمز أعلاه يطبع خارج حمولة من AAAAs مع == في النهاية، وهو الصحيح.

وتخميني هو أن $data على الجانب PHP لا يحتوي على ما enc لم على الجانب C # - تحقق لهم ضد بعضها البعض

وفي ج #

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

ويتحول إلى

dGhpcyBpcyBhIDxCPmxvbmc8L2I+c3RyaW5nLiBhbmQgbGV0cyBtYWtlIHRoaXMgYTMyMTQgYWQwLTMyMTQgMGN6Y3ggOTA5MzQwIHp4Y2kgMDMyNCMkQCMkJSUxMzI0NDUxMzEyMw==

وبالنسبة لي. وأعتقد أن + هو كسر كل شيء.

والجانب PHP يجب أن يكون: $ البيانات = $ _REQUEST [ 'في']. // $ decdata = urldecode ($ البيانات)؛ $ الخام = base64_decode ($ decdata)؛

يجب أن يكون بالفعل URLdecoded و$ _REQUEST.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top