3

这可能是一个非常本地化的问题,对社区的其他人没有用,但希望有人可以帮助我。

我知道的

我有一个 base64 编码的 ZIP,在一个字符串中,在一个 XML 元素内。

该文件如下所示:

<Document>
   <Content vesion="1"><!-- BASE64 STRING ---></Content>
</Document>

我想做的事

解码字符串,然后解压缩。

到目前为止我尝试过的(但失败了)

  • 解码 base64 字符串并将其放入带有 zip 扩展名的文件中

    public string DecodeFrom64(string encodedData)
    {
    
        byte[] encodedDataAsBytes
    
            = System.Convert.FromBase64String(encodedData);
    
        string returnValue =
    
           System.Text.Encoding.Unicode.GetString(encodedDataAsBytes);
    
        return returnValue;
    
    }
    
  • 尝试使用以下函数解压缩字符串:

    public static string DecompressString(string compressedText)
    {
        byte[] gZipBuffer = Convert.FromBase64String(compressedText);
        using (var memoryStream = new MemoryStream())
        {
            int dataLength = BitConverter.ToInt32(gZipBuffer, 0);
            memoryStream.Write(gZipBuffer, 4, gZipBuffer.Length - 4);
    
            var buffer = new byte[dataLength];
    
            memoryStream.Position = 0;
            using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
            {
                gZipStream.Read(buffer, 0, buffer.Length);
            }
    
            return Encoding.UTF8.GetString(buffer);
        }
    }
    

得到错误:

GZip 标头中的幻数不正确。确保您传递的是 GZip 流...

  • 尝试使用以下函数解压缩字符串:

    public static string UnZipStr(string compressedText)
    {
        byte[] input = Convert.FromBase64String(compressedText);
        using (MemoryStream inputStream = new MemoryStream(input))
        {
            using (DeflateStream gzip =
              new DeflateStream(inputStream, CompressionMode.Decompress))
            {
                using (StreamReader reader =
                  new StreamReader(gzip, System.Text.Encoding.UTF8))
                {
                    return reader.ReadToEnd();
                }
            }
        }
    }
    

得到错误:

块长度与其补码不匹配...

我向向我的客户发送此 XML 数据的人发送了一封邮件,但问题是他们的响应速度非常慢(3-4 周)。

所以我希望有人能指出我正确的方向。

我不能将文件附加到问题中,所以如果有人想看看它,我可以发送邮件或其他什么?

4

1 回答 1

5

正如哈罗德在评论中已经指出的那样,这都是错误的。在您的上一条评论(Jester)中,您澄清了 zip 文件首先被转换为字符串,然后该字符串被转换为 base64 字符串。由于这绝对没有意义(你为什么要这样做),我想你在那里出了点问题,实际上意味着文件被转换为 base64 字符串。例如,这是电子邮件的最佳实践,我最近一直在这样做,以通过 XMPP 中的 XML 传输文件。我的猜测是……

byte[] file = System.Convert.FromBase64String(encodedData);
File.WriteAllBytes(directoryToWriteTo+filename+".zip", file);

... creates the file you're looking for. byte[] here already IS a zip file. As zip files can be messy to deal with (as you didn't really say what's in there), I would recommend saving these bytes to a file and try to open it with a zip-software like WinRar. If this worked and you can get the file contents out of the zip file, you could ask another question how to the the contents. I would also recommend using SharpZipLib.dll, because it's really the only solution I got working in reasonable time so far.

于 2012-10-13T15:29:23.270 回答