解码base64加密字符串

时间:2012-10-13 13:02:39

标签: c# xml zip base64 unzip

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

我所知道的

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

该文件如下所示:

<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周)。

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

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

1 个答案:

答案 0 :(得分:5)

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

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

...创建您正在寻找的文件。 byte []这里已经是一个zip文件。由于zip文件处理起来很麻烦(因为你没有真正说出那些内容),我建议将这些字节保存到文件中并尝试使用像WinRar这样的zip软件打开它。如果这有效并且您可以从zip文件中获取文件内容,则可以询问另一个问题如何获取内容。我还建议使用SharpZipLib.dll,因为它确实是我到目前为止在合理时间内工作的唯一解决方案。