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

二进制到日期(C#)64位格式,c#,datetime,64-bit,binary,C#,Datetime,64 Bit,Binary,我们有一个二进制文件,从中我们确定了以下日期(如Int64)。我们现在了解有关日期/时间格式的以下事实: 64位日期的分辨率为微秒 64位日期的范围为4095年 Int64 9053167636875050944(0x7DA34FFFFFFFC0)=2010年3月9日 Int64 9053176432968073152(0x7DA357FFFFFFC0)=2010年3月10日 Int64 9053185229061095360(0x7DA35FFFFFFFC0)=2010年3月11日 Int6

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

  • 64位日期的分辨率为微秒
  • 64位日期的范围为4095年
  • Int64 9053167636875050944(0x7DA34FFFFFFFC0)=2010年3月9日
  • Int64 9053176432968073152(0x7DA357FFFFFFC0)=2010年3月10日
  • Int64 9053185229061095360(0x7DA35FFFFFFFC0)=2010年3月11日
  • Int64 905319404025154117568(0x7DA367FFFFFFC0)=2010年3月12日

如果您能帮助我们找到一种方法,将其转换为有效的C#日期/时间,我们将不胜感激。

从十六进制数据中,至少可以清楚地看到:

0x7da=2010

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

0x7da=2010
0x3=3(三月)
01001111=前5位似乎是日期(9),后三位始终是您向我们展示的1

其余的位可能表示进一步的解析(小时、分钟等)

与绿色联合通讯社@BlueRaja所说的不同,这里是解析它的方法:

        var X = 0x7da34fffffffffc0L;
        var Year = X >> 52;
        var Month = (X >> 48) & 0xf;
        var Day = (X >> 43) & 0x1f;
以下是一个解决方案:

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

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

我添加了十六进制版本,因为如果你能看到位的话,解码二进制压缩的东西就容易多了。在十六进制中,你可以(如果你眯着眼睛的话)。糟糕的是,这不仅仅是一天以来的微秒数。然而,由于.NET的DateTime是100纳秒单位,而且这些值已经超过了
DateTime.MaxValue.Ticks
…以澄清这一点。这不是标准的C#datetime ticks dateData。对于那些想知道C#中的dateTime是如何被屏蔽的人,请参考这里:您需要将其转换为int以使用dateTime构造函数。“时间值以100纳秒为单位进行测量,称为滴答声,特定日期是自公历公元1年1月1日午夜12:00以来的滴答声数。”---.NET的DateTime documentationok,那么您可以将微秒添加到DateTime对象中的Tick属性以获得更准确的时间?