2008-11-02 16 views
9

Tak więc mam tę aplikację C#, która musi pingować mój serwer WWW, że działa z linux/php.
Mam problemy z C# sposobem bazowania 64 bajtów kodowania.C# do PHP base64 kodowanie/dekodowanie

mój kod C# jest tak: strona

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

i php:

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

z większych ciągów 100+ zwęgla się nie powiedzie. Myślę, że jest to spowodowane dodaniem C# 'w kodowaniu, ale nie jestem pewien. Wszelkie wskazówki

+0

Excuse moja niewiedza, jest to niezbędne do base64 zakodować ciąg UTF-8 przed przekazaniem go? Widzę, że możesz potrzebować go zakodować. – Jodrell

Odpowiedz

14

Prawdopodobnie powinieneś zakodować kod bazy Base64 na stronie C# przed wysłaniem.

I URL Dekoduje go na stronie php przed dekodowaniem go przez base64.

C# boku

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

i PHP boczny:

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

Convert.ToBase64String nie wydaje się dodawać niczego więcej, o ile widzę. Na przykład:

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

Powyższy kod wyświetla obciążenie AAAA z == na końcu, co jest poprawne.

Domyślam się, że $data po stronie PHP nie zawiera tego, co zrobił enc po stronie C# - sprawdź je względem siebie.

7

Należy pamiętać, że + jest prawidłowym znakiem w kodowaniu base64, ale używany w adresach URL jest często tłumaczony z powrotem na spację. Ta przestrzeń może mylić twoją funkcję PHP base64_decode.

Masz dwa podejścia do rozwiązywania tego problemu:

  • Wykorzystanie% -encoding zakodować znak + przed opuszczeniem aplikacji C#.
  • W swojej aplikacji PHP przetłumacz znaki spacji na + przed przekazaniem do base64_decode.

Pierwsza opcja to prawdopodobnie lepszy wybór.

+0

dzięki. tak, że + był problem w adresie URL. zrobił coś takiego. małpa hacki FTW string enc = Convert.ToBase64String (encbuff) .Replace ("+", "===="); i $ raw = str_replace ("====", "+", $ raw); –

+1

To jeden sposób, aby to zrobić. Proponowałem zastąpienie "+" przez "% 2B" w aplikacji C#, wtedy nie będziesz musiał nic robić w aplikacji PHP. –

0

wC#

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

zamienia

dGhpcyBpcyBhIDxCPmxvbmc8L2I+c3RyaW5nLiBhbmQgbGV0cyBtYWtlIHRoaXMgYTMyMTQgYWQwLTMyMTQgMGN6Y3ggOTA5MzQwIHp4Y2kgMDMyNCMkQCMkJSUxMzI0NDUxMzEyMw== 

dla mnie. i myślę, że + to wszystko łamie.

0

boczne interpreter powinien być: $ dane = $ _REQUEST [ 'w']; // $ decdata = urldecode ($ data); $ raw = base64_decode ($ decdata);

$ _REQUEST powinien już być oznaczony URL.

3

To wydaje się działać, zastępując% 2B + z ...

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; 

}