Бинарный к дате (C #) 64-битный формат - PullRequest
2 голосов
/ 13 апреля 2010

У нас есть двоичный файл, из которого мы определили следующие даты (как Int64). Теперь мы рассмотрим следующие факты о формате даты / времени:

  • 64-битная дата имеет разрешение в микросекундах
  • 64-битная дата имеет диапазон 4095 лет
  • Int64 9053167636875050944 (0x7DA34FFFFFFFFFC0) = 9 марта 2010
  • Int64 9053176432968073152 (0x7DA357FFFFFFFFC0) = 10 марта 2010
  • Int64 9053185229061095360 (0x7DA35FFFFFFFFFC0) = 11 марта 2010 года
  • Int64 9053194025154117568 (0x7DA367FFFFFFFFC0) = 12 марта 2010

Любая помощь в поиске способа конвертировать это в действительный C # Дата / Время приветствуется.

Ответы [ 4 ]

2 голосов
/ 13 апреля 2010

0x7da = 2010
0x3 = 3 (март)
01001111 = первые 5 бит кажутся днем ​​(9), последние три всегда равны 1 из того, что вы нам показали
Остальные биты, вероятно, представляют дальнейшее разрешение (часы, минуты и т. Д.)

2 голосов
/ 13 апреля 2010

Исходя из того, что сказал @BlueRaja The Green Unic, вот как вы могли бы это проанализировать:

        var X = 0x7da34fffffffffc0L;
        var Year = X >> 52;
        var Month = (X >> 48) & 0xf;
        var Day = (X >> 43) & 0x1f;
2 голосов
/ 13 апреля 2010

Из шестнадцатеричных данных, по крайней мере, это ясно:

0x7da = 2010

Следующее 3 очень вероятно, март (месяц 3).

0 голосов
/ 13 апреля 2010

Вот решение:

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 #, но я могу ошибаться.

...