PHP base64 kodlama / kod çözme C #

6 Cevap

So I have this c# application that needs to ping my web server thats running linux/php stack.
I am having problems with the c# way of base 64 encoding bytes.

benim c # kodu gibi:

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

ve php tarafı:

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

with larger strings 100+ chars it fails. I think this is due to c# adding '+'s in the encoding but not sure. any clues

6 Cevap

Eğer göndermeden önce muhtemelen URL C # tarafında Base64 dize Encode gerekir.

Ve URL Çözümün önce base64 için php tarafında bunu Decode.

C # yan

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

ve php tarafı:

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

+ geçerli bir karakter base64 kodlaması olduğunu, ancak URL'leri kullanıldığında genellikle geri alana çevrilmiş olduğunu unutmayın. Bu alan sizin PHP base64_decode function kafa karıştırıcı olabilir.

Bu sorunu çözmek için iki yaklaşım vardır:

  • Sizin C # uygulama bırakır önce + karakteri kodlamak için%-kodlamasını kullanın.
  • PHP uygulama, base64_decode geçmeden önce geri + uzay karakterleri çevirmek.

İlk seçenek muhtemelen daha iyi bir seçimdir.

Convert.ToBase64String kadarıyla gördüğünüz gibi ekstra bir şey eklemek görünmüyor. Örneğin:

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

Yukarıdaki kod doğru olduğunu, sonunda == ile aaaas bir yük yazdırır.

Aralarında onları kontrol - Benim tahminim $data PHP tarafında enc C # tarafında yaptıklarını içermiyor olmasıdır.

Bu% 2B ile + yerine, iş gibi görünüyor ...

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;

}

c #

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

dönüşür

dGhpcyBpcyBhIDxCPmxvbmc8L2I+c3RyaW5nLiBhbmQgbGV0cyBtYWtlIHRoaXMgYTMyMTQgYWQwLTMyMTQgMGN6Y3ggOTA5MzQwIHp4Y2kgMDMyNCMkQCMkJSUxMzI0NDUxMzEyMw==

benim için. ve i + tüm kırılma olduğunu düşünüyorum.

The PHP side should be: $data = $_REQUEST['in']; // $decdata = urldecode($data); $raw = base64_decode($decdata);

$ _REQUEST Zaten urlkoduçözümü yapilacak edilmelidir.