我有一个从文件中读取时间的应用程序。这些时间可以采用三种不同的格式,基于文件中其他位置的标志位,如下所示:
[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
个语句?是否有一种软件模式可以简化这种模式,使其更加通用化,并抽象出一些复杂性?
答案 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中,其余代码可以作用于抽象。