如何将8字节十六进制转换为DateTime

poc*_*oco 0 c# datetime

我正在尝试解析一个文件,该文件具有一个我认为长度为8个字节的时间戳,在十六进制中看起来像这样

00 00 00 00 DE A4 4F 4F

当我将其解析为Int64时,我没有收到正确的日期/时间.但是,如果我跳过前4个字节并执行类似的操作,我会得到正确的日期时间.

TimeSpan span = TimeSpan.FromTicks(BitConverter.ToInt32(bytes.Skip(index).Take(8).ToArray(),4) * TimeSpan.TicksPerSecond);
DateTime t = new DateTime(1970, 1, 1).Add(span);
StartTime = TimeZone.CurrentTimeZone.ToLocalTime(t);
Run Code Online (Sandbox Code Playgroud)

但是我不确定我要解析的下一个文件是否会有前4个字节的前导00.如果我将其解析为ToInt64,我会抛出一个outOfRange异常.解析这个的正确方法是什么?

Jon*_*eet 5

你确定这些值实际上并非如此

DE A4 4F 4F 00 00 00 00
Run Code Online (Sandbox Code Playgroud)

...例如,由于您错误地计算了文件中的位置?

这会更有意义,并代表一个小端64位整数,你可以这样转换:

static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0,
                                              DateTimeKind.Utc);

...

long seconds = BitConverter.ToInt64(data, index);
DateTime date = Epoch + TimeSpan.FromSeconds(seconds);
Run Code Online (Sandbox Code Playgroud)

(注意这个转换代码有多简单,顺便说一句 - 没有乱用LINQ,也没有多重代价TicksPerSecond.)

编辑:如果它真的是两个小端32位整数,以big-endian顺序排列来创建一个64位整数,那么你可以使用:

ulong x = BitConverter.ToUInt32(data, index);
ulong y = BitConverter.ToUInt32(data, index + 4);
ulong combined = (x << 32) | y;
long seconds = unchecked ((long) combined);
Run Code Online (Sandbox Code Playgroud)