解码经过base64加密的字符串

3

这可能是一个仅适用于特定区域的问题,对于社区中的其他人没有用处,但希望有人能帮助我。

我的了解

我有一个base64编码的ZIP文件,在一个XML元素内以字符串的形式存在。

文件如下所示:

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

我想要做什么

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

我尝试过但失败了的方法

  • Decoded the base64 string and put it in a file with a zip extension

    public string DecodeFrom64(string encodedData)
    {
    
        byte[] encodedDataAsBytes
    
            = System.Convert.FromBase64String(encodedData);
    
        string returnValue =
    
           System.Text.Encoding.Unicode.GetString(encodedDataAsBytes);
    
        return returnValue;
    
    }
    
  • Tried to unzip the string with the function:

    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头中的Magic Number不正确。请确保您正在传递一个GZip流...

  • Tried to decompress the string with the function:

    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
你能展示第一项选项写入磁盘的文件的前几个字节吗?最好是十六进制。 - Joachim Isaksson
1
这完全是错的。Base64解码的结果不是字符串,你不应该假装它是。而且,你现在正在进行两次Base64解码。 - harold
@JulienLebosquain:尝试您的建议,会及时反馈结果。 - Jester
通过 Joachim 的提示,我已经解决了问题,稍后会发布答案。基本上该文件是一个 PKzip 文件,转换为字符串,再转换为 base64 字符串。所以 Approach 1 最初就是正确的,只是将文件保存为 UTF8,而 ASCII 看起来更适合。等有时间时我会稍后发布答案。 - Jester
1
尽管它能工作,但我并不完全相信它是正确的。数据应该是一个base64编码的ZIP文件,对吧?而不是一个base64编码的“纯文本ZIP文件”,因为这种东西不存在。只需将字节保存为字节,因为它们就是字节。 - harold
显示剩余9条评论
1个回答

5

正如 Harold 在评论中指出的那样,这一切都是错误的。在您最后的评论(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,因为这是我迄今为止唯一能在合理时间内使用的解决方案。


是的,这种方法是正确的,我只是将概念表述错误了。基本上它是文件->BASE64->XML => 返回。 - Jester

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接