C # для PHP base64 encode / decode

Таким образом, у меня есть это приложение c #, которое должно выполнить ping на моем веб-сервере, на котором выполняется linux / php stack.
У меня возникают проблемы с 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 # добавляет '+' в кодировку, но не уверен. любые подсказки

Related of "C # для PHP base64 encode / decode"

Вероятно, вам нужно URL-адрес Кодировать строку 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); 

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

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

  • Используйте% -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)); 

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

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

в c #

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

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

 dGhpcyBpcyBhIDxCPmxvbmc8L2I+c3RyaW5nLiBhbmQgbGV0cyBtYWtlIHRoaXMgYTMyMTQgYWQwLTMyMTQgMGN6Y3ggOTA5MzQwIHp4Y2kgMDMyNCMkQCMkJSUxMzI0NDUxMzEyMw== 

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

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

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