加载文件不工作- GZip头中的神奇数字不正确

本文关键字:神奇 数字 不正确 GZip 文件 工作 加载 | 更新日期: 2023-09-27 17:50:52

我正在尝试创建一个保存/加载类,有保存&加载文件压缩文件。下面是我到目前为止所做的。逐步通过它似乎工作得很好,除了我得到一个"神奇的数字在GZip头是不正确的"异常。我不明白这是怎么回事,因为我正在检查以确保数字在我通过它之前存在,并且我已经通过外部程序验证了它是一个GZip文件。

如果你能帮助我找出我的错误,我将不胜感激。欢迎对我的代码提出建设性的批评-谢谢!
public static class SaveLoad
{
    public static void Save(string fileName, object savefrom, bool compress)
    {
        FileStream stream = new FileStream(fileName, FileMode.Create);
        BinaryFormatter formatter = new BinaryFormatter();
        if (compress)
        {
            GZipStream compressor = new GZipStream(stream, CompressionMode.Compress);
            formatter.Serialize(compressor, savefrom);
            compressor.Close();
        }
        else { formatter.Serialize(stream, savefrom); }
        stream.Close();
    }
    public static object Load(string fileName)
    {
        object loadedObject = null;
        try
        {
            FileStream stream = new FileStream(fileName, FileMode.Open);
            BinaryFormatter formatter = new BinaryFormatter();
            if (stream.Length > 4)
            {
                byte[] data = new byte[4];
                stream.Read(data, 0, 4);
                if (BitConverter.ToUInt16(data, 0) == 0x8b1f) //GZIP_LEAD_BYTES == 0x8b1f
                {
                    GZipStream decompressor = new GZipStream(stream, CompressionMode.Decompress);
                    loadedObject = formatter.Deserialize(decompressor); //Exception
                    decompressor.Close();
                }
                else { loadedObject = formatter.Deserialize(stream); }
            }
            stream.Close();
        }
        catch (Exception e)
        {
            Logger.StaticLog.AddEvent(new Logger.lEvent(null, Logger.lEvent.EventTypes.Warning, "Failed to load file: " + fileName, e)
            {
                SendingObject = "SaveLoad"
            });
            Logger.StaticLog.WriteLog();
            throw;
        }
        return loadedObject;
    }
}

加载文件不工作- GZip头中的神奇数字不正确

似乎在将流传递给解压缩器之前读取了幻数(此时解压缩器不会读取幻数,因为您已经读取了它)。

解压前使用stream.Seek(0,SeekOrigin.Begin)