С# в PHP base64 кодировать/декодировать

Итак, у меня есть это приложение С#, которому нужно пропинговать мой веб-сервер, на котором работает стек linux/php.
У меня проблемы с кодировкой С# в 64 байтах.

мой код С# выглядит так:

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

и сторона php:

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

с большими строками 100+ символов это не удается. Я думаю, это связано с тем, что С# добавляет «+» в кодировку, но не уверен. любые подсказки


person w-ll    schedule 02.11.2008    source источник
comment
Извините за невежество, необходимо ли base64 кодировать строку UTF8 перед ее передачей? Я вижу, вам может понадобиться кодировать URL.   -  person Jodrell    schedule 07.11.2012


Ответы (6)


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

И URL-адрес декодирует его на стороне php до декодирования base64.

Сторона С#

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);
person Eoin Campbell    schedule 02.11.2008
comment
Нет необходимости декодировать urldecode на стороне $data php. Он уже был декодирован в $_REQUEST['in']. - person Bug Raptor; 09.03.2020

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

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

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

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

person Greg Hewgill    schedule 02.11.2008
comment
благодаря. да, это + была проблема в URL-адресе. сделал что-то вроде этого. обезьяна взламывает строку FTW enc = Convert.ToBase64String(encbuff).Replace(+, ====); и $raw = str_replace(====,+,$raw); - person w-ll; 03.11.2008
comment
Ну, это действительно один из способов сделать это. Я предлагал заменить + на %2B в приложении C#, тогда вам вообще ничего не придется делать в приложении PHP. - person Greg Hewgill; 03.11.2008

Кажется, это работает, заменив + на %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;

}
person cliff    schedule 09.11.2011

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

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

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

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

person Jon Skeet    schedule 02.11.2008

in c#

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

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

dGhpcyBpcyBhIDxCPmxvbmc8L2I+c3RyaW5nLiBhbmQgbGV0cyBtYWtlIHRoaXMgYTMyMTQgYWQwLTMyMTQgMGN6Y3ggOTA5MzQwIHp4Y2kgMDMyNCMkQCMkJSUxMzI0NDUxMzEyMw==

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

person w-ll    schedule 02.11.2008

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

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

person Community    schedule 25.06.2009