我正在尝试从XML节点读取文本。该文本是基于64加密和Gzip压缩。我正在尝试以下方式:
1. XmlNodeList nodeDebugs = xmlDoc.GetElementsByTagName("Debugs");
2. if (nodeDebugs != null)
3. {
4. for (int i = 0; i < nodeDebugs.Count; i++)
5. {
6. XmlNodeList childNodes = nodeDebugs.Item(i).ChildNodes;
7. String nodeName = childNodes.Item(i).Name;
8. if (nodeName == "Debug")
9. {
10. byte[] compressed = System.Text.Encoding.UTF8.GetBytes(childNodes.Item(i).InnerText.Trim());
11. using (var uncompressed = new MemoryStream())
12. using (var inStream = new MemoryStream(compressed))
13. using (var outStream = new GZipStream(inStream, CompressionMode.Decompress))
14. {
15. outStream .CopyTo(uncompressed);
16. Console.WriteLine(Encoding.UTF8.GetString(uncompressed.ToArray()));
17. }
在第15行获取错误,因为“gzip标头中的幻数不正确”。 我们非常感谢您解决此问题的任何帮助。非常感谢。
答案 0 :(得分:1)
这是问题,我怀疑:
byte[] compressed = System.Text.Encoding.UTF8.GetBytes(childNodes.Item(i).InnerText.Trim());
你说你的数据是压缩的,然后是base64编码的...但是你的代码并没有在任何地方使用base64,这是一个巨大的警示标志。我怀疑你想要:
string text = childNodes.Item(i).InnerText.Trim();
byte[] compressed = Convert.FromBase64String(text);
如果没有工作,你应该检查转换的每一步 - 在编码和解码过程中你应该有相同的数据,只是顺序相反。有关详细信息,请参阅我的blog post about diagnosing reversible data transformations - 但希望无论如何上述更改都会解决此问题。