質問

つまり、linux / phpスタックを実行しているWebサーバーにpingを実行する必要があるこのc#アプリケーションがあります。
base64エンコードバイトのc#の方法に問題があります。

私のc#コードは次のようなものです:

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

およびphp側:

$data = 

つまり、linux / phpスタックを実行しているWebサーバーにpingを実行する必要があるこのc#アプリケーションがあります。
base64エンコードバイトのc#の方法に問題があります。

私のc#コードは次のようなものです:

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

およびphp側:

<*>

100文字以上の大きな文字列では失敗します。 これは、C#がエンコーディングに「+」を追加したためだと思いますが、確かではありません。 手がかり

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

100文字以上の大きな文字列では失敗します。 これは、C#がエンコーディングに「+」を追加したためだと思いますが、確かではありません。 手がかり

役に立ちましたか?

解決

送信する前に、おそらく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 = 

送信する前に、おそらく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側:

<*>REQUEST['in']; $decdata = urldecode($data); $raw = base64_decode($decdata);

他のヒント

+ はbase64エンコーディングで有効な文字ですが、URLで使用される場合、スペースに変換されることが多いことに注意してください。このスペースは、PHPの base64_decode 関数を混乱させる可能性があります。

この問題を解決するには、2つのアプローチがあります:

  • C#アプリケーションを終了する前に、%-encodingを使用して+文字をエンコードします。
  • PHPアプリケーションで、base64_decodeに渡す前にスペース文字を+に変換し直します。

最初のオプションはおそらくより良い選択です。

これは機能しているようで、+を%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は、私が見る限り、何も追加しません。例えば:

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

上記のコードは、末尾に==が付いたAAAAの負荷を出力します。これは正しいです。

私の推測では、PHP側の $ data には、C#側で enc が行った内容が含まれていません。相互に確認してください。

C#で

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

に変わる

dGhpcyBpcyBhIDxCPmxvbmc8L2I+c3RyaW5nLiBhbmQgbGV0cyBtYWtlIHRoaXMgYTMyMTQgYWQwLTMyMTQgMGN6Y3ggOTA5MzQwIHp4Y2kgMDMyNCMkQCMkJSUxMzI0NDUxMzEyMw==

私にとって。 +がすべてを壊していると思います。

PHP側は次のようになります。 $ data = $ _REQUEST ['in']; // $ decdata = urldecode($ data); $ raw = base64_decode($ decdata);

$ _ REQUESTはすでにURLデコードされているはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top