Pergunta

Então, eu tenho este # aplicação c que as necessidades de executar ping meus isso é servidor web rodando Linux / php pilha.
Estou tendo problemas com o c # forma de base de 64 bytes de codificação.

meu c # código é semelhante:

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

e do lado php:

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

com cordas maiores 100+ chars ele falhar. Eu acho que isso é devido ao c # acrescentando '+' s na codificação, mas não tenho certeza. nenhuma pista

Foi útil?

Solução

Você deve URL Encode seu Base64 seqüência provavelmente no lado do C #, antes de enviá-lo.

E URL decodificá-lo no lado do PHP anteriores ao base64 decodificá-lo.

# lado C

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

e do lado php:

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

Outras dicas

Note que + é um carácter válido na codificação Base64, mas quando usado em URLs muitas vezes é traduzida de volta para um espaço. Este espaço pode ser confundindo sua função PHP base64_decode.

Você tem duas abordagens para resolver este problema:

  • Use% -encoding para codificar o carácter + antes de deixar o aplicativo C #.
  • Na sua aplicação PHP, traduzir caracteres espaço de volta para + antes de passar para base64_decode.

A primeira opção é provavelmente a sua melhor escolha.

Isso parece funcionar, substituindo + com% 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 não parece acrescentar nada extra, tanto quanto eu posso ver. Por exemplo:

byte[] bytes = new byte[1000];
Console.WriteLine(Convert.ToBase64String(bytes));

O código acima imprime uma carga de AAAAs com == no final, o qual é correcta.

Meu palpite é que $data no lado do PHP não contém o enc fez no lado do C # -. Verifique-os uns contra os outros

em c #

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

transforma em

dGhpcyBpcyBhIDxCPmxvbmc8L2I+c3RyaW5nLiBhbmQgbGV0cyBtYWtlIHRoaXMgYTMyMTQgYWQwLTMyMTQgMGN6Y3ggOTA5MzQwIHp4Y2kgMDMyNCMkQCMkJSUxMzI0NDUxMzEyMw==

para mim. E eu acho que + é quebrar tudo.

O lado PHP deve ser: $ data = $ _REQUEST [ 'em']; // $ decdata = urldecode ($ data); $ Raw = base64_decode ($ decdata);

A $ _REQUEST já deve estar URLdecoded.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top