【问题标题】:How to get the length of the compressed data from DeflateStream?如何从 DeflateStream 中获取压缩数据的长度?
【发布时间】:2021-11-29 11:07:13
【问题描述】:

以下是我使用DeflateStream写的一个简单的压缩方法:

public static int Compress(
    byte[] inputData, 
    int inputStartIndex, 
    int inputLength, 
    byte[] outputData, 
    int outputStartIndex, 
    int outputLength)
{
    if (inputData == null)
        throw new ArgumentNullException("inputData must be non-null");

    MemoryStream memStream = new MemoryStream(outputData, outputStartIndex, outputLength);

    using (DeflateStream dstream = new DeflateStream(memStream, CompressionLevel.Optimal))
    {
        dstream.Write(inputData, inputStartIndex, inputLength);
        return (int)(memStream.Position - outputStartIndex);
    }
}

这个方法的特别之处在于我没有使用MemoryStream的无参数构造函数。这是因为它是一个高吞吐量的服务器。数组outputData是从ArrayPool租来的,用来存放压缩后的字节,使用后可以返回给ArrayPool

压缩发生正确,压缩数据正确放入outputData,但memStream.Position为零,所以我无法找出MemoryStream写入了多少字节。

只有outputData 的一部分被压缩数据占用。如何知道压缩数据的长度?

【问题讨论】:

    标签: c# memorystream deflatestream


    【解决方案1】:

    MemoryStream.Position 为 0,因为在您读取 Position 时数据实际上还没有写入那里。相反,告诉 DeflateStream 让底层流 (MemoryStream) 保持打开状态,然后处置 DeflateStream。在这一点上,您可以确定它已完成编写所需的任何内容。现在您可以阅读MemoryStream.Position 来检查写入了多少字节:

    public static int Compress(
        byte[] inputData, 
        int inputStartIndex, 
        int inputLength, 
        byte[] outputData, 
        int outputStartIndex, 
        int outputLength)
    {
        if (inputData == null)
            throw new ArgumentNullException("inputData must be non-null");
    
        using (var memStream = new MemoryStream(outputData, outputStartIndex, outputLength)) {
    
            // leave open
            using (DeflateStream dstream = new DeflateStream(memStream, CompressionLevel.Optimal, leaveOpen: true)) {
                dstream.Write(inputData, inputStartIndex, inputLength);
            }
    
            return (int) memStream.Position; // now it's not 0
        }
    }
    

    您也不需要减去outputStartIndex,因为Position 已经与您传递给构造函数的索引相关。

    【讨论】:

      猜你喜欢
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多