如何从 DeflateStream 中获取压缩数据的长度?
How to get the length of the compressed data from DeflateStream?
下面是我用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
租来的,用来存放压缩后的字节,这样我用完之后就可以 return 到 ArrayPool
.
压缩正确,压缩后的数据正确放入outputData
,但memStream.Position
为零,所以我无法查出有多少字节写入了MemoryStream
.
只有outputData
的一部分被压缩后的数据占用。如何找出压缩数据的长度?
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
已经相对于您传递给构造函数的索引。
下面是我用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
租来的,用来存放压缩后的字节,这样我用完之后就可以 return 到 ArrayPool
.
压缩正确,压缩后的数据正确放入outputData
,但memStream.Position
为零,所以我无法查出有多少字节写入了MemoryStream
.
只有outputData
的一部分被压缩后的数据占用。如何找出压缩数据的长度?
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
已经相对于您传递给构造函数的索引。