我无法解密文字

时间:2011-12-08 11:48:51

标签: c# asp.net .net asp.net-mvc encoding

我有网址http://translate.google.ru/translate_a/t?client=x&text=ввійти вийти&sl=ua&tl=en

如果您将通过此链接作为回复,您将使用正常翻译文本的js文件:

{"sentences":[{"trans":"enter exit","orig":"ввійти вийти","translit":"","src_translit":"vviy̆ty vyy̆ty"}],"src":"uk","server_time":127}

但是如果你通过程序获得这些数据,你将加密翻译数据:

{"sentences":[{"trans":"\u00D0 \u00B2 \u00D0 \u00B2 \u00D1-\u00D0 \u00B9 \u00D1,
 \u00D0 \u00B8 \u00D0 \u00B2 \u00D0 \u00B8 \u00D0 \u00B9 \u00D1, \u00D0 \u00B8",
"orig":"\u00D0\u00B2\u00D0\u00B2\u00D1?\u00D0\u00B9\u00D1?\u00D0\u00B8 \u00D0\u0
0B2\u00D0\u00B8\u00D0\u00B9\u00D1?\u00D0\u00B8","translit":"","src_translit":""}
],"src":"is","server_time":4}

通过这段代码,我得到了这些数据。

string url = @"http://translate.google.ru/translate_a/t?client=x&text=ввійти вийти&sl=ua&tl=en";
            WebRequest request = WebRequest.Create(url);
            request.Timeout = 5000;
            WebResponse responce = request.GetResponse();
            Stream stream = responce.GetResponseStream();
            StreamReader st = new StreamReader(stream);
            string responsText = st.ReadToEnd();
            Console.WriteLine(responsText);
            Console.ReadLine();

我如何解密这些数据?

1 个答案:

答案 0 :(得分:4)

数据未加密。它是编码的。如果你使用正确的JSON反序列化,比如DataJsonContractSerializer类,这不会有问题,因为框架会为你解码数据。

[DataContract]
public class TranslationData {
    [DataMember(Name = "sentences")]
    public Sentence[] Sentences { get; set; }

    [DataMember(Name = "src")]
    public string Source { get; set; }

    [DataMember(Name = "server_time")]
    public int ServerTime { get; set; }
}

[DataContract]
public class Sentence {
    [DataMember(Name = "trans")]
    public string Translation { get; set; }

    [DataMember(Name = "orig")]
    public string Original { get; set; }

    [DataMember(Name = "translit")]
    public string Transliteration { get; set; }

    [DataMember(Name = "src_translit")]
    public string SourceTransliteration { get; set; }
}

然后使用System.Runtime.Serialization.Json.DataContractJsonSerializer类进行反序列化(您必须添加对System.Runtime.Serialization程序集的引用)以直接从响应流中读取:

var serializer = new DataContractJsonSerializer(typeof(TranslationData));
return (TranslationData)serializer.ReadObject(theResponseStream);

还有其他方法可以做到这一点,但这样你就可以得到很好的打字数据。