解码Base64和膨胀Zlib压缩XML

本文关键字:压缩 XML Zlib 膨胀 Base64 解码 | 更新日期: 2023-09-27 18:03:20

很抱歉这么长,我会尽量简短。

我正在使用json API(当然没有文档),它返回如下内容:

{
uncompressedlength: 743637,
compressedlength: 234532,
compresseddata: "lkhfdsbjhfgdsfgjhsgfjgsdkjhfgj"
}

数据(在这种情况下是xml)被压缩,然后是base64编码的数据,我试图提取。我只有用perl编写的演示代码来解码它:

use Compress::Zlib qw(uncompress);
use MIME::Base64  qw(decode_base64);
my $uncompresseddata = uncompress(decode_base64($compresseddata));

看起来很简单。

我已经尝试了许多方法来解码base64:

 private string DecodeFromBase64(string encodedData)
    {
        byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);
        string returnValue = System.Text.Encoding.Unicode.GetString(encodedDataAsBytes);
        return returnValue;
    }
    public string base64Decode(string data)
    {
        try
        {
            System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
            System.Text.Decoder utf8Decode = encoder.GetDecoder();
            byte[] todecode_byte = Convert.FromBase64String(data);
            int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
            char[] decoded_char = new char[charCount];
            utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);
            string result = new String(decoded_char);
            return result;
        }
        catch (Exception e)
        {
            throw new Exception("Error in base64Decode" + e.Message);
        }
    }

我已经尝试使用Ionic.Zip.dll (DotNetZip?)和zlib.net来膨胀Zlib压缩。但是所有的都出错了。我正试图找出问题的根源。是base64解码还是膨胀?

我总是得到一个错误时,膨胀使用zlib:我得到一个坏的魔术数错误使用zlib.net,我得到"坏状态(无效存储块长度)"时,使用DotNetZip:

string decoded = DecodeFromBase64(compresseddata);
string decompressed = UnZipStr(GetBytes(decoded));

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

看完后:http://george.chiramattel.com/blog/2007/09/deflatestream-block-length-does-not-match.html听听其中一条评论。我将代码更改为:

MemoryStream memStream = new MemoryStream(Convert.FromBase64String(compresseddata));
memStream.ReadByte();
memStream.ReadByte();
DeflateStream deflate = new DeflateStream(memStream, CompressionMode.Decompress);
string doc = new StreamReader(deflate, System.Text.Encoding.UTF8).ReadToEnd();

它工作得很好。

解码Base64和膨胀Zlib压缩XML

这就是罪魁祸首:

http://george.chiramattel.com/blog/2007/09/deflatestream-block-length-does-not-match.html

通过跳过前两个字节,我可以简化为:

MemoryStream memStream = new MemoryStream(Convert.FromBase64String(compresseddata));
memStream.ReadByte();
memStream.ReadByte();
DeflateStream deflate = new DeflateStream(memStream, CompressionMode.Decompress);
string doc = new StreamReader(deflate, System.Text.Encoding.UTF8).ReadToEnd();

首先,使用System.IO.Compression.DeflateStream重新膨胀数据。您应该能够使用MemoryStream作为输入流。您可以使用Convert.FromBase64Stringbyte[]结果创建MemoryStream。

你可能会导致各种各样的麻烦,试图将base64结果转换为给定的编码;使用原始数据直接Deflate