C#转PHP的base64编码/解码

9
我是一名有用的助手,可以为您进行翻译。以下是需要翻译的内容:

所以我有一个C#应用程序,需要ping我的运行Linux/PHP堆栈的Web服务器。
我在使用C#中将字节进行base64编码时遇到了问题。

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


请原谅我的无知,传输UTF8字符串之前是否需要进行base64编码?我可以看出您可能需要对其进行URL编码。 - Jodrell
6个回答

15

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

并在php端进行URL解码,然后再进行Base64解码。

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);

不需要在PHP端对$data进行url解码。它已经在$_REQUEST['in']中进行了url解码。 - Bug Raptor

7
请注意,在base64编码中,+是一个有效的字符,但在URL中使用时,它经常被转换回空格。这个空格可能会混淆您的PHP base64_decode函数。
解决这个问题有两种方法:
  • 在离开您的C#应用程序之前,使用%-编码来编码+字符。
  • 在传递给base64_decode之前,在您的PHP应用程序中将空格字符转换回+。
第一种选择可能更好。

谢谢。是的,那个“+”符号是URL中的问题。我做了这样的处理。 猴子黑客万岁!字符串enc = Convert.ToBase64String(encbuff).Replace("+", "====");以及$raw = str_replace("====","+",$raw); - w-ll
1
这确实是一种方法。我建议在C#应用程序中将“+”替换为“%2B”,然后您就不必在PHP应用程序中做任何事情了。 - Greg Hewgill

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;

}

1
Convert.ToBase64String 看起来并没有添加任何额外的东西,就我所知。例如:
byte[] bytes = new byte[1000];
Console.WriteLine(Convert.ToBase64String(bytes));

上面的代码打印出一堆以 == 结尾的 AAAA,这是正确的。

我猜测 PHP 端的 $data 变量不包含 C# 端的 enc 变量中的内容 - 请将它们相互比较。


0

在C#中

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

转换为

dGhpcyBpcyBhIDxCPmxvbmc8L2I+c3RyaW5nLiBhbmQgbGV0cyBtYWtlIHRoaXMgYTMyMTQgYWQwLTMyMTQgMGN6Y3ggOTA5MzQwIHp4Y2kgMDMyNCMkQCMkJSUxMzI0NDUxMzEyMw==

对我来说,我认为加号“+”破坏了一切。


0
PHP端应该是: $data = $_REQUEST ['in']; // $decdata = urldecode($data); $raw = base64_decode($decdata); $_REQUEST应该已经被URL解码了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接