Таким образом, у меня есть это приложение 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 # добавляет '+' в кодировку, но не уверен. любые подсказки
Вероятно, вам нужно 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.
У вас есть два подхода к решению этой проблемы:
Первый вариант, вероятно, ваш лучший выбор.
Кажется, это работает, заменив + на% 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.