C# 计算数据长度并将偏移量值写入二进制流

C# 计算数据长度并将偏移量值写入二进制流,c#,C#,我正在使用BinaryWriter将数据写入gzip压缩文件流。我希望在头中包含偏移量值,以便在读取时,我可以查找并仅读取特定部分,而不是整个文件 但是,我没有找到关于如何设置这些值的清晰文档 以下是我目前拥有的作家的一个例子: using (var writer = new BinaryWriter(stream)) { foreach (IPersistedObject obj in objectsToWrite) { writer.Write(target.Key);

我正在使用
BinaryWriter
将数据写入gzip压缩文件流。我希望在头中包含偏移量值,以便在读取时,我可以查找并仅读取特定部分,而不是整个文件

但是,我没有找到关于如何设置这些值的清晰文档

以下是我目前拥有的作家的一个例子:

using (var writer = new BinaryWriter(stream)) {
  foreach (IPersistedObject obj in objectsToWrite) {
     writer.Write(target.Key);
     writer.Write(target.SchemaVersion);
     // writer a bunch of object-specific data
  }
}
但要在文件头中写入偏移量,我需要:

  • 首先将所有这些编码为二进制
  • 检查它们的长度
  • 将其偏移量/长度写入文件头
  • 然后写下实际的数据
  • 我还假设压缩会把这一切都搞砸。这就是它的工作原理还是我缺少了其他的技巧


    我也不清楚如何正确地检查数据的二进制长度。根据现有文档,我需要先使用Convert.ToString,然后检查其长度。

    我们再来一次。首先,你是否关心打包二进制文件需要多长时间,或者仅仅是读取时间?你首先需要需求。之前的帖子你只关心解包时间。另外,您刚才讨论的只是二进制,现在您正在考虑打包到字符串,这需要时间来打包和解包。gzip将负责包装,因此您不需要再进行其他级别的包装。对于二进制数据,您所要做的就是在每个对象前面加一个字节计数,这样您就可以解压缩每个对象。向对象添加指针可以加快访问速度,但需要额外的打包时间。我在上一篇文章中问了一个不同的问题(同一主题,只是寻求关于一般方法的建议),所以我不清楚你在这里回答的是什么。我一直在使用BinaryWriter将原语写入二进制文件。“我如何计算偏移量”是我试图理解的。几个月前添加gzip的唯一原因是压缩生成的文件以减小文件大小。如果它会妨碍我的抵销工作,我可以将其删除。我只想停止为每个唯一的组件使用唯一的文件。gzip没有问题,只是在使用gzip之前不要打包数据。偏移量是先前偏移量的总和。所以假设长度为8个字节:Block 1=(length_1 object_1,length_2,object_2,length_3 object_3)。所以块2偏移量是8+length\u 1+8+length\u 2+8+length\u 3。对,这意味着我需要计算每段数据的二进制大小,然后才能写入长度,对吗?我需要在文件头中写入偏移量,因此我试图在实际写入偏移量之前了解确定其长度的最佳方法。还有,我不明白你说的“打包”是什么意思。我正在将数据写入BinaryWriter,我没有在gzip之外进行任何“打包”。打包可能意味着压缩、压缩或编码。需要在每次写入当前写入之前写入大小。因此大小应该是sizeof(target.Key)和sizeof(target.SchemaVersion)。