Как я могу обобщить использование этих различных структур данных? - PullRequest
1 голос
/ 27 июля 2010

У меня есть приложение, которое читает время из файла.Это время может быть в трех разных форматах, основанных на битах флагов в других местах файла, как показано ниже:

[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;
}

Как видите, все три формата времени занимают восемь байтов в файле исходных данных,но эти восемь байтов приводятся по-разному , в зависимости от указанного формата времени.

Однако время вывода всегда одинаково, независимо от того, как оно хранится в файле исходных данных (либо ГГГ ЧЧ: ММ: ДД SS.ssssss , где ssssss равнодоли секунды, или SSSSS.ssssss в виде секунд и долей секунд после полуночи).

Как мне прочитать эти времена из файла данных и использовать их в общем, без необходимостиcase заявления повсюду?Существует ли программный шаблон, который бы упростил это, сделал бы его более обобщенным и абстрагировал бы от некоторых сложностей?

Ответы [ 2 ]

1 голос
/ 27 июля 2010
[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);
0 голосов
/ 27 июля 2010

Я бы рекомендовал шаблон репозитория.

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, остальная часть вашего кода может работать с абстракциями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...