【问题标题】:Accessing base memorystream [for read] in a binarywriter在二进制写入器中访问基本内存流 [用于读取]
【发布时间】:2013-12-27 08:42:42
【问题描述】:

我有一个由内存流支持的二进制写入器:

BinaryWriter m_binaryWriter = new BinaryWriter(new MemoryStream(BUFFER_SIZE));

我想获取基本阅读器并将其读入字节数组:

long DataLength = m_binaryWriter.BaseStream.Length;
byte[] MemoryStrData = new byte[DataLength];
int BytesRead = m_binaryWriter.BaseStream.Read(MemoryStrData, 0, (int)DataLength);

但是,BytesRead 始终为 0(显然 MemoryStrData 包含所有 0)。我试图使用 BinaryReader 从基本流中读取流,但这导致了同样的事情。我在这里遗漏了什么吗?

【问题讨论】:

  • 你确定你不是在追求BinaryReader 而不是BinaryWriter..?
  • 是的,我正在将数据写入二进制写入器,但想要访问一个连续的块(一旦它越过 BUFFER_SIZE)。
  • 您最好实现从Stream 派生的自定义类并在您的类中实现任何奇怪的缓冲/部分提交/日志记录(无论您通过从流中读取随机块来追求什么)...

标签: c# memorystream binarywriter


【解决方案1】:

您是否一直都知道 BinaryWriter 将由 MemoryStream 支持?

如果是这样,要么保留对 MemoryStream 的引用,要么根据需要强制转换 BaseStream,然后使用MemoryStream.ToArray() 获取 MemoryStream 内容的字节数组。

【讨论】:

  • 是的,它将始终由内存流支持。当达到 buffer_size 时,我清除 binarywriter 并处理后端。在此之后,我重新创建它。我认为 Compact Framework 不支持 .ToArray(),但我可以检查一下。
  • 根据文档,至少在 .NET 3.5 MemoryStream 中是受支持的。不过,我对 .NET Compact Framework 了解不多,因此请确认您是否有机会。
  • 感谢您的建议。紧凑框架中既没有名为 .ToArray() 的成员,也没有名为 MemoryStream.ToArray() 的工厂。正是出于这个原因,我使用 .Read()。现在,我很好奇是否必须使用后端字节数组初始化 MemoryStream。我知道有一个带有“bool WriteAble”标志的重载。这个需要设置吗?另一点需要注意的是,当我写入它时,内存流的长度确实会增加......
  • 我不明白你为什么找不到 .ToArray()。文档说它在 .NET Compact Framework 1、2 和 3.5 中受支持。
【解决方案2】:

我解决了。 BinaryWriter 的当前索引似乎与其后端流的位置不同!我认为获取基本流的句柄然后执行 .read(OutputArray,Index,Count) 就足够了,但是您需要对 BinaryWriter 本身进行搜索:

m_binaryWriter.Seek(0, SeekOrigin.Begin);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-28
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 2021-12-26
    • 1970-01-01
    相关资源
    最近更新 更多