c# - 如何存储协议(protocol)/规范结构

标签 c# .net

实现 ISO Creator(主要作为智力练习)我需要存储 cd 数据结构值。

例如,来自规范的第 47 页 https://www.cs.cmu.edu/~varun/cs315p/iso9660.pdf , 为了以 ISO9660 格式存储目录,我需要存储有关各种字节字段的信息

enter image description here

还有其他的表,比如存储字段的Path Tables,字段总数有几百个。

所以我也可以

1 - 将这些存储在 .cs 文件中,本质上是“硬编码”

public byte length=1;
public byte ExtendedAttributeLength = 0;
//and so on

2- 我可以将这些作为常量存储在 .cs 文件中

3 - 我可以将这些存储在 XML 文件中

4- 我什至可以将这些存储在数据库表中

考虑到这些值不太可能改变,但并非不可能,我不确定应该以哪种方式存储这些值。

谢谢

最佳答案

我认为您可以将所有这些规范定义为具有显式布局的结构。这样您就可以为每个字段指定偏移量:

[StructLayout(LayoutKind.Explicit, Size=16, CharSet=CharSet.Ansi)]
public struct DirectoryRecord
{
   [FieldOffset(0)]
   byte RecordLength;

   [FieldOffset(1)]
   byte ExtendedAttrRecordLength;

   ...
}

然后您可以将它们序列化为字节数组,并大概将它们保存为 ISO 镜像头的一部分或它们在其中的任何位置。


但是,如果您查看现有的 C# ISO9660 实现之一,例如 .NET DiscUtils on CodePlex你会发现他们做事的方式有点不同。

对于 DirectoryRecord,他们定义了一个类,其中包含 ReadFromWriteTo 方法,它负责从输入流中的适当偏移量读取数据。这是一种选择。最重要的是,它们还有一些其他组件读取文件并将读取委托(delegate)给子组件,例如这个组件。

所以,你可以像他们那样做。或者您可以像我之前提到的那样使用结构来实现,并让它们的行为仅像 POCO,而不是额外的读写逻辑。您必须在其他地方执行此操作。

关于c# - 如何存储协议(protocol)/规范结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25469934/

相关文章:

c# - 在源代码控制中没有 bin 文件夹的情况下,在引用项目中使用新类构建失败,但成功了,为什么?

c# - 通用接口(interface)、实现和依赖注入(inject) - 实现类型无法转换为服务类型

c# 合并单元格作为头地址epplus

c# - 如何使用 HttpClient 和 Polly 制定重试或回退策略以使用不同的 URL 重试?

.net - WPF:在具有关闭按钮的子窗口镶边中包含控件

c# - 有没有办法在 C# 中获取 F# 的构造函数参数是自动不可变私有(private)成员功能?

c# - 游戏开发 xna/unity3d

c# - 在不尝试发送电子邮件的情况下检查邮件服务器是否使用 SSL

.NET DropDownList SelectedIndexChanged 事件未在 IE 10 中触发

c# - .NETTY : Second batch of data sent includes the first?