二进制到日期(C#)64位格式

问题描述 投票:2回答:4

我们有一个二进制文件,我们从中确定了以下日期(如Int64)。我们现在有关日期/时间格式的以下事实;

  • 64位日期的分辨率为微秒
  • 64位日期的范围为4095年
  • Int64 9053167636875050944(0x7DA34FFFFFFFFFC0)= 2010年3月9日
  • Int64 9053176432968073152(0x7DA357FFFFFFFFC0)= 2010年3月10日
  • Int64 9053185229061095360(0x7DA35FFFFFFFFFC0)= 2010年3月11日
  • Int64 9053194025154117568(0x7DA367FFFFFFFFC0)= 2010年3月12日

任何有关找出将其转换为有效C#日期/时间的方法的帮助表示赞赏。

c# datetime 64bit binary
4个回答
0
投票

这是一个解决方案:

string hex_data = "7DA34FFFFFFFFFC0";
        Int64 int_datetime = Convert.ToInt64(hex_data, 16);

        int year = (int)(int_datetime >> 52);
        int month = (int)((int_datetime >> 48) & 0x0F);
        int day = (int)(((int_datetime >> 43) & 0x1F));

        int hour = (int)(((int_datetime >> 38) & 0x1F)) > 24 ? 0 : (int)(((int_datetime >> 38) & 0x1F));
        int min = (int)(((int_datetime >> 32) & 0x3F)) > 60 ? 0 : (int)(((int_datetime >> 32) & 0x3F));
        int sec = (int)(((int_datetime >> 26) & 0x3F)) > 60 ? 0 : (int)(((int_datetime >> 26) & 0x3F));
        int mili_sec = (int)(((int_datetime >> 16) & 0x3FF)) > 100 ? 0 : (int)(((int_datetime >> 16) & 0x3FF));
        int micro_sec = (int)(((int_datetime >> 6) & 0x3FF)) > 100 ? 0 : (int)(((int_datetime >> 6) & 0x3FF));

        string str_date_time = year.ToString("D4") + "/" + month.ToString("D2") + "/" + day.ToString("D2") + " " + hour.ToString("D2") + ":" + min.ToString("D2") + ":" 
            + sec.ToString("D2") + "." + mili_sec.ToString("D3");

        DateTime date_time_dt=DateTime.Parse(str_date_time);

返回:

09/03/2010 12:00:00 AM

在date_time_dt对象中。我不认为DateTime对象支持C#中的微秒,但我可能错了。


2
投票

从十六进制数据来看,至少这一点很清楚:

0x7da = 2010

接下来很可能是3月(第3个月)。


2
投票

0x7da = 2010 0x3 = 3(三月) 01001111 =前5位似乎是第9天,最后3位总是从你向我们展示的1位 其余的位可能代表进一步的分辨率(小时,分钟等)


2
投票

关于什么@BlueRaja绿色联想说,这是你如何解析它:

        var X = 0x7da34fffffffffc0L;
        var Year = X >> 52;
        var Month = (X >> 48) & 0xf;
        var Day = (X >> 43) & 0x1f;
© www.soinside.com 2019 - 2024. All rights reserved.