You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C# .NET 6中实现LZSW解压.Z文件的技术求助

LZSW 解压实现(C# .NET 6)

关于字典的困惑解答

Rosetta Code里的初始字典设计没有问题。0-255的键对应的是单字节的二进制值,和C#中char是16位无关——我们完全不需要用char来处理这个逻辑,直接用byte或int类型存储字典的键和值即可,因为整个解压过程操作的是原始字节流,不是编码后的字符。

解压方法实现

下面是符合byte[] Decompress(byte[] input)签名的LZSW解压代码,专门用于处理.Z格式的压缩数据:

using System.Collections.Generic;

public static class LzswDecompressor
{
    public static byte[] Decompress(byte[] input)
    {
        if (input == null || input.Length == 0)
            return Array.Empty<byte>();

        // 初始化字典:键0-255对应单个字节的值
        var dictionary = new Dictionary<int, List<byte>>();
        for (int i = 0; i < 256; i++)
        {
            dictionary.Add(i, new List<byte> { (byte)i });
        }

        var output = new List<byte>();
        int currentCode = input[0];
        output.AddRange(dictionary[currentCode]);
        int nextCode = 256;
        int inputIndex = 1;

        while (inputIndex < input.Length)
        {
            int code = input[inputIndex];
            inputIndex++;

            List<byte> entry;
            if (dictionary.TryGetValue(code, out entry))
            {
                output.AddRange(entry);
                // 将当前条目 + 新条目首字节添加到字典
                var newEntry = new List<byte>(dictionary[currentCode]);
                newEntry.Add(entry[0]);
                dictionary.Add(nextCode++, newEntry);
            }
            else
            {
                // 处理特殊情况:代码不在字典中(LZSW标准容错逻辑)
                var newEntry = new List<byte>(dictionary[currentCode]);
                newEntry.Add(dictionary[currentCode][0]);
                output.AddRange(newEntry);
                dictionary.Add(nextCode++, newEntry);
            }

            currentCode = code;
        }

        return output.ToArray();
    }
}

代码说明

  • 字典初始化:直接用0-255作为键,对应的值是单个字节的列表,完全贴合原始字节的处理需求,避开了char的16位问题。
  • 字节流处理:全程用List<byte>存储输出数据,最后转换为byte[]返回,和你读取文件的ReadAllBytes流程完美适配。
  • 边界处理:加入了代码不在字典中的特殊情况处理,这是LZSW算法的标准容错逻辑,避免解压过程中出现异常。

使用示例

// 读取.Z文件
byte[] compressedData = File.ReadAllBytes("example.z");
// 解压
byte[] decompressedData = LzswDecompressor.Decompress(compressedData);
// 写入解压后的文件
File.WriteAllBytes("example_decompressed.bin", decompressedData);

内容的提问来源于stack exchange,提问作者Matheos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 23:30:48