C # в PHP base64 кодировать / декодировать - PullRequest
9 голосов
/ 03 ноября 2008

Итак, у меня есть это приложение на c #, которое должно пропинговать мой веб-сервер, на котором работает стек Linux / PHP. У меня проблемы с c # способом байтов кодирования base 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+ символов это не удастся. Я думаю, что это связано с добавлением + в '+' в кодировке, но не уверен. любые подсказки

Ответы [ 6 ]

15 голосов
/ 03 ноября 2008

Вам, вероятно, следует кодировать строку Base64 на стороне C # перед отправкой.

И URL Расшифруйте его на стороне php перед декодированием base64.

C # сторона

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

и сторона php:

$data = $_REQUEST['in'];
$decdata = urldecode($data);
$raw = base64_decode($decdata);
7 голосов
/ 03 ноября 2008

Обратите внимание, что + является допустимым символом в кодировке base64, но при использовании в URL он часто переводится обратно в пробел. Это место может сбивать с толку вашу функцию PHP base64_decode.

У вас есть два подхода к решению этой проблемы:

  • Используйте% -encoding для кодирования символа +, прежде чем он покинет ваше приложение C #.
  • В вашем приложении PHP переводите пробельные символы обратно в + перед передачей в base64_decode.

Первый вариант, вероятно, ваш лучший выбор.

3 голосов
/ 09 ноября 2011

Это похоже на работу, заменяя + на% 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;

}
1 голос
/ 03 ноября 2008

Convert.ToBase64String, кажется, не добавляет ничего лишнего, насколько я вижу. Например:

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

Приведенный выше код распечатывает загрузку AAAA с == в конце, что является правильным.

Я предполагаю, что $data на стороне PHP не содержит того, что enc сделал на стороне C # - проверьте их друг против друга.

0 голосов
/ 26 июня 2009

PHP сторона должна быть: $ data = $ _REQUEST ['in']; // $ decdata = urldecode ($ data); $ raw = base64_decode ($ decdata);

$ _REQUEST уже должен быть закодирован URL.

0 голосов
/ 03 ноября 2008

в c #

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

превращается в

dGhpcyBpcyBhIDxCPmxvbmc8L2I+c3RyaW5nLiBhbmQgbGV0cyBtYWtlIHRoaXMgYTMyMTQgYWQwLTMyMTQgMGN6Y3ggOTA5MzQwIHp4Y2kgMDMyNCMkQCMkJSUxMzI0NDUxMzEyMw==

для меня. и я думаю, что + ломает все это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...