Кодирование / декодирование C# на PHP base64
Вопрос
Итак, у меня есть это приложение на 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 символов это не удается.Я думаю, это связано с тем, что 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 = Вам, вероятно, следует 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:
<*>REQUEST['in'];
$decdata = urldecode($data);
$raw = base64_decode($decdata);
Другие советы
Обратите внимание , что +
является допустимым символом в кодировке base64, но при использовании в URL-адресах он часто переводится обратно в пробел.Это пространство может сбивать с толку ваш PHP base64_decode
функция.
У вас есть два подхода к решению этой проблемы:
- Используйте %-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;
}
Конвертировать.ToBase64String, похоже, не добавляет ничего дополнительного, насколько я могу видеть.Например:
byte[] bytes = new byte[1000];
Console.WriteLine(Convert.ToBase64String(bytes));
Приведенный выше код выводит загрузку AAAAs с == в конце, что является правильным.
Я предполагаю, что $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.