0

Feed Burner がブログ サービスの結果を変更し、次のような JavaScript のブロックを返すようにしました。

document.write("\x3cdiv class\x3d\x22feedburnerFeedBlock\x22 id\x3d\x22RitterInsuranceMarketingRSSv3iugf6igask14fl8ok645b6l0\x22\x3e"); document.write("\x3cul\x3e"); document.write("\x3cli\x3e\x3cspan class\x3d\x22headline\x22\x3e\x3ca href\x3d\x22

これから生のhtmlが欲しいです。以前は、 .Replace を使用して document.write 構文を簡単に切り離すことができましたが、これがどのようなエンコーディングであるか、少なくとも C# でデコードする方法がわかりません。

編集:まあ、これは最終的に解決するのに半悪夢でした.

public static  char ConvertHexToASCII(this string hex)
{
    if (hex == null) throw new ArgumentNullException(hex);
    return (char)Convert.ToByte(hex, 16);
}

.

private string DecodeFeedburnerHtml(string html)
{
    var builder = new StringBuilder(html.Length);
    var stack = new Stack<char>(4);
    foreach (var chr in html)
    {
        switch (chr)
        {
            case '\\':
                if (stack.Count == 0)
                {
                    stack.Push(chr);
                }
                else
                {
                    stack.Clear();
                    builder.Append(chr);
                }
                break;
            case 'x':
                if (stack.Count == 1)
                {
                    stack.Push(chr);
                }
                else
                {
                    stack.Clear();
                    builder.Append(chr);
                }
                break;
            default:
                if (stack.Count >= 2)
                {
                    stack.Push(chr);

                    if (stack.Count == 4)
                    {
                        //get stack[3]stack[4]
                        string hexString = string.Format("{1}{0}", stack.Pop(),
                                                     stack.Pop());

                        builder.Append(hexString.ConvertHexToASCII());
                        stack.Clear();
                    }
                }
                else
                {
                    builder.Append(chr);
                }
                break;
        }
    }

    html = builder.ToString();
    return html;
}

他に何ができるかわかりません。なんらかの理由で、このようなコードは、線形時間アルゴリズムであるにもかかわらず、常に非常に汚いと感じます。これは、必要な時間に関連していると思います。

4

3 に答える 3

1

これらは、16 進数でエンコードされた ASCII 値のように見えます。文字列をトラバースし、a の\x後に 2 つの 16 進数 (0-9,af) が続く場合は、対応する ASCII 文字に置き換えます。StringBuilder文字列が長い場合は、 を使用する代わりに、結果を段階的に に保存する方が高速String.Replace()です。

エンコーディングの仕様はわかりませんが、従うべきルールが他にもあるかもしれません (たとえば、 if\\はリテラルのエスケープ文字です\)。

于 2010-12-15T20:48:31.897 に答える
1

これは PHP Twig エンコーディングです。

http://www.twig-project.org/

C# を使用しているため、シンボルを変換するための辞書を作成し、一連の.Replace()文字列メソッドを使用してそれらを HTML 文字に変換する必要があります。

または、そのデータをファイルに保存し、Perl スクリプトを実行してテキストをデコードし、ファイルから C# で読み取ることもできますが、コストが高くなる可能性があります。

于 2010-12-15T20:36:02.540 に答える