gpt4 book ai didi

c# - MemoryStream CopyTo 仅部分写入

转载 作者:行者123 更新时间:2023-11-30 12:11:09 24 4
gpt4 key购买 nike

我快要失去理智了。在过去的一个小时里,我一直试图让 GzipStream 压缩一个字符串,但出于某种原因,它拒绝将整个字节数组写入内存流。起初我认为它与 using 语句有关,但即使在删除它们之后似乎也没有什么不同。

初始配置:

var str = "Here is a relatively simple string to compress";
byte[] compressedBytes;
string returnedData;

var bytes = Encoding.UTF8.GetBytes(str);

正确工作(写入 64 位字节数组):

using (var msi = new MemoryStream(bytes))
using (var mso = new MemoryStream()) {
using (var gs = new GZipStream(mso, CompressionMode.Compress)) {
msi.CopyTo(gs);
}

compressedBytes = mso.ToArray();
}

失败(写入 10 个长度的字节数组):

using(var mso = new MemoryStream())
using(var msi = new MemoryStream(bytes))
using(var zip = new GZipStream(mso, CompressionMode.Compress))
{
msi.CopyTo(zip);
compressedBytes = mso.ToArray();
}

同样失败(写入 10 个长度的字节数组):

var mso = new MemoryStream();
var msi = new MemoryStream(bytes);
var zip = new GZipStream(mso, CompressionMode.Compress);

msi.CopyTo(zip);
compressedBytes = mso.ToArray();

有人可以解释为什么第一个有效但在其他两个中我得到这些不完整的数组吗?有什么东西从我身下被处理掉了吗?就此而言,有没有办法避免使用两个内存流?

谢谢,放大镜

最佳答案

System.IO.Compression.GZipStream 必须关闭(处置)才能使用底层流,因为

  1. 它是面向 block 的
  2. 它必须写页脚,包括校验和(参见 the file format description on Wikipedia )

关于c# - MemoryStream CopyTo 仅部分写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16049093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com