9

所以我有这个 c# 应用程序,它需要 ping 我的运行 linux/php 堆栈的 Web 服务器。
我在使用 base 64 编码字节的 c# 方式时遇到问题。

我的 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# 在编码中添加了“+”,但不确定。任何线索

4

6 回答 6

15

在发送之前,您可能应该在 C# 端对您的 Base64 字符串进行 URL 编码。

并在base64解码之前在php端对其进行URL解码。

C#端

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

和php方面:

$data = $_REQUEST['in'];
$decdata = urldecode($data);
$raw = base64_decode($decdata);
于 2008-11-02T22:24:51.757 回答
7

请注意,这+是 base64 编码中的有效字符,但在 URL 中使用时,它通常会转换回空格。这个空间可能会混淆您的 PHPbase64_decode函数。

你有两种方法来解决这个问题:

  • 使用 %-encoding 在 + 字符离开您的 C# 应用程序之前对其进行编码。
  • 在您的 PHP 应用程序中,在传递给 base64_decode 之前将空格字符转换回 +。

第一个选项可能是您更好的选择。

于 2008-11-02T22:18:35.840 回答
3

这似乎可行,将 + 替换为 %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;

}
于 2011-11-09T05:59:51.877 回答
1

据我所知,Convert.ToBase64String 似乎没有添加任何额外的东西。例如:

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

上面的代码打印出一堆带有 == 的 AAAA,这是正确的。

我的猜测是,$data在 PHP 端不包含enc在 C# 端所做的 - 相互检查它们。

于 2008-11-02T22:16:58.823 回答
0

在c#中

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

变成

dGhpcyBpcyBhIDxCPmxvbmc8L2I+c3RyaW5nLiBhbmQgbGV0cyBtYWtlIHRoaXMgYTMyMTQgYWQwLTMyMTQgMGN6Y3ggOTA5MzQwIHp4Y2kgMDMyNCMkQCMkJSUxMzI0NDUxMzEyMw==

为了我。我认为 + 打破了这一切。

于 2008-11-02T22:19:30.363 回答
0

PHP端应该是: $data = $_REQUEST['in']; // $decdata = urldecode($data); $raw = base64_decode($decdata);

$_REQUEST 应该已经被 URL 解码。

于 2009-06-25T21:44:55.993 回答