如何概括这些不同数据结构的使用?

时间:2010-07-27 16:11:04

标签: c# .net data-structures

我有一个从文件中读取时间的应用程序。这些时间可以采用三种不同的格式,基于文件中其他位置的标志位,如下所示:

[StructLayout(LayoutKind.Sequential, Pack = 1]
public struct IntraPacketTime_RTC
{
    public UInt64 RTC;
}

[StructLayout(LayoutKind.Sequential, Pack = 1]
public struct IntraPacketTime_Ch4
{
    public UInt16 Unused;
    public UInt16 TimeHigh;
    public UInt16 TimeLow;
    public UInt16 MicroSeconds;
}

[StructLayout(LayoutKind.Sequential, Pack = 1]
public struct IntraPacketTime_IEEE1588
{
    public UInt32 NanoSeconds;
    public UInt32 Seconds;
}

如您所见,所有三种时间格式在源数据文件中占用八个字节,但这八个字节以不同方式转换,具体取决于指定的时间格式。

但是,输出时间总是相同的格式,无论它存储在源数据文件中的方式如何( YYY HH:MM:DD SS.ssssss ,其中ssssss是分数第二个,或 SSSSS.ssssss 为秒和午夜后的小数秒。)

如何从数据文件中读取这些时间并以一般方式使用它们,而不是在所有地方都有case个语句?是否有一种软件模式可以简化这种模式,使其更加通用化,并抽象出一些复杂性?

2 个答案:

答案 0 :(得分:1)

[StructLayout(LayoutKind.Explicit)]
public struct IntraPacketTime {
    [FieldOffset(0)]
    private UInt64 RTC;

    [FieldOffset(0)]
    private UInt32 NanoSeconds;
    [FieldOffset(4)]
    private UInt32 Seconds;

    [FieldOffset(0)]
    private UInt16 Unused;
    [FieldOffset(2)]
    private UInt16 TimeHigh;
    [FieldOffset(4)]
    private UInt16 TimeLow;
    [FieldOffset(6)]
    private UInt16 MicroSeconds;        

    public DateTime GetTime(IntraPacketTimeFormat format) {
        switch (format) {
            ...
        }
    }
    public explicit operator IntraPacketTime(Int64 value) {
        return new IntraPacketTime { RTC = value; }
    }
}

public enum IntraPacketTimeFormat {
    None,
    RTC,
    Ch4,
    IEEE1588,
}

你应该可以使用

IntraPacketTime t = (IntraPacketTime)binaryReader.ReadInt64();
var time = t.GetTime(IntraPacketTimeFormat.Ch4);

答案 1 :(得分:0)

我建议使用存储库模式。

class TimeReader
{
    public void ExtractTimeFormat(StreamReader data)
    {
        // read the flag and set state so that ExtractTime will return the
        // correct time implemenation
    }
    public ITime ExtractTime(StreamReader data)
    {
        // extract the appropriate time instance from the data based on
        // the current time format
    }
}

interface ITime
{
    void WriteTime(StreamWriter data);  
    void WriteTimeFlags(StreamWriter data);
    DateTime GetTime();
}

唯一的case语句在ExtractTime中,其余代码可以作用于抽象。