c# - decodificar base64 php online
C#a PHP base64 codifica/decodifica (6)
Cª#
this is a <B>long</b>string. and lets make this a3214 ad0-3214 0czcx 909340 zxci 0324#$@#$%%13244513123
se convierte en
dGhpcyBpcyBhIDxCPmxvbmc8L2I+c3RyaW5nLiBhbmQgbGV0cyBtYWtlIHRoaXMgYTMyMTQgYWQwLTMyMTQgMGN6Y3ggOTA5MzQwIHp4Y2kgMDMyNCMkQCMkJSUxMzI0NDUxMzEyMw==
para mi. y creo que + está rompiendo todo.
Así que tengo esta aplicación c # que necesita hacer ping a mi servidor web que está ejecutando la pila linux / php.
Estoy teniendo problemas con la forma c # de la base 64 codificando bytes.
mi código c # es como:
byte[] encbuff = System.Text.Encoding.UTF8.GetBytes("the string");
String enc = Convert.ToBase64String(encbuff);
y lado php:
$data = $_REQUEST[''in''];
$raw = base64_decode($data);
con cadenas más grandes, más de 100 caracteres falla. Creo que esto se debe a c # agregando ''+'' s en la codificación, pero no estoy seguro. alguna pista
Convert.ToBase64String no parece agregar nada extra por lo que puedo ver. Por ejemplo:
byte[] bytes = new byte[1000];
Console.WriteLine(Convert.ToBase64String(bytes));
El código anterior imprime una carga de AAAA con == al final, que es correcto.
Mi suposición es que $data
en el lado PHP no contiene lo que enc
hizo en el lado C # - compruébalos uno contra el otro.
Probablemente debas URL Codifica tu cadena Base64 en el lado C # antes de enviarla.
Y URL Decodifíquelo en el lado php antes de descifrarlo base64.
Lado C #
byte[] encbuff = System.Text.Encoding.UTF8.GetBytes("the string");
string enc = Convert.ToBase64String(encbuff);
string urlenc = Server.UrlEncode(enc);
y lado php:
$data = $_REQUEST[''in''];
$decdata = urldecode($data);
$raw = base64_decode($decdata);
Tenga en cuenta que +
es un carácter válido en la codificación base64, pero cuando se usa en las URL a menudo se traduce nuevamente a un espacio. Este espacio puede confundir su función PHP base64_decode
.
Tienes dos enfoques para resolver este problema:
- Use% -encoding para codificar el carácter + antes de que salga de su aplicación C #.
- En su aplicación PHP, traduzca los caracteres espaciales a + antes de pasar a base64_decode.
La primera opción es probablemente tu mejor opción.
El lado PHP debe ser: $ data = $ _REQUEST [''in'']; // $ decdata = urldecode ($ data); $ raw = base64_decode ($ decdata);
El $ _REQUEST ya debería estar URLdecoded.
Esto parece funcionar, reemplazando + con% 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;
}