2008-11-02 19 views
9

Así que tengo esta aplicación C# que necesita hacer ping a mi servidor web que está ejecutando la pila linux/php.
Tengo problemas con la forma C# de los bytes de codificación base 64.C# a PHP base64 codificar/decodificar

mi código C# es como: lado

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

y php:

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

con las cadenas más grandes 100+ char de falla. Creo que esto se debe a C# agregando '+' s en la codificación, pero no estoy seguro. cualquier pista

+0

excusa mi ignorancia, es necesario base64 codifican una cadena UTF8 antes de transferirla? Veo que podrías necesitar codificarlo en la URL. – Jodrell

Respuesta

14

Probablemente deberías URL Codifica tu cadena Base64 en el lado C# antes de enviarla.

Y URL Decodifíquelo en el lado php antes de descifrar base64.

C# lado

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

y php lado:

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

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.

Supongo que $data en el lado de PHP no contiene lo que enc hizo en el lado C# - compruébalos uno contra el otro.

7

Tenga en cuenta que + es un carácter válido en la codificación base64, pero cuando se utiliza en las URL a menudo se traduce nuevamente a un espacio. Este espacio puede estar confundiendo su función PHP base64_decode.

usted tiene dos enfoques para resolver este problema:

  • Uso codificación% para codificar el carácter + antes de que salga de su aplicación en C#.
  • En su aplicación PHP, traduzca los caracteres de espacio a + antes de pasar a base64_decode.

La primera opción es probablemente su mejor opción.

+0

gracias. sí, ese + fue el problema en la url. hizo algo como esto mono hacks FTW string enc = Convert.ToBase64String (encbuff) .Replace ("+", "===="); y $ raw = str_replace ("====", "+", $ raw); –

+1

Bueno, esa es una forma de hacerlo de hecho. Lo que sugerí fue reemplazar "+" con "% 2B" en la aplicación C#, entonces no tendrá que hacer nada en absoluto en la aplicación PHP. –

0

en C#

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

convierte en

dGhpcyBpcyBhIDxCPmxvbmc8L2I+c3RyaW5nLiBhbmQgbGV0cyBtYWtlIHRoaXMgYTMyMTQgYWQwLTMyMTQgMGN6Y3ggOTA5MzQwIHp4Y2kgMDMyNCMkQCMkJSUxMzI0NDUxMzEyMw== 

para mí. y creo que + está rompiendo todo.

0

El lado PHP debería ser: $ datos = $ _REQUEST [ 'en']; // $ decdata = urldecode ($ data); $ raw = base64_decode ($ decdata);

El $ _REQUEST ya debe estar URLdecoded.

3

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; 

}