如何解码windows 64bit十六进制值:小端时间?

时间:2017-05-06 07:44:44

标签: c++ time decode

Convert result of Dcode.exe

我想解码windows 64bit十六进制值:C ++中的小端时间。

我有一个值(= FB7E5D6A355DD201),但我不知道如何在C ++中解码这个值。

请告诉我示例代码或相关网站。

1 个答案:

答案 0 :(得分:1)

在unix系统中,日期/时间通常(但不总是)记录为32位整数,表示自Epoch(1970年1月1日00:00:00)以来的秒数。但是对于 Windows 64位LE 格式,它意味着自00:00:00.000,000,0 Jan 1, 1601"以来过去了#100; x100纳秒。您的十六进制数是一个原始二进制整数,因此scanf可以很容易地解释它 这是我从一个最古老的C程序中找到的东西。您可以自己优化它并添加时区支持。

#include <stdio.h>
int mDays[12]={31,28,31,30,31,30,31,31,30,31,30,31};
const int daySec = 86400;
int yearDays(int y){
    return 365 + (y%400==0 || (y%4==0 && y%100!=0));
    // Pre-Caesar calendar doesn't work well, don't add it
}
void win_u64tod(unsigned long long utime){
    int y=1601, d=0, mo=0, h=0, m=0, s=0, ms=0;
    ms = utime % 10000000;
    utime /= 10000000;

    while (utime >= daySec*yearDays(y)){
        utime -= daySec*yearDays(y);
        y ++;
    }
    if (yearDays(y) == 366) mDays[1]=29;
    d = utime / daySec;
    utime %= daySec;
    while (d >= mDays[mo]){
        d -= mDays[mo];
        mo ++;
    }
    h = utime/3600;
    utime %= 3600;
    m = utime/60;
    s = utime%60;
    printf("%4u-%2u-%2u %2u:%02u:%02u.%07u\n", y, 1+mo, 1+d, h, m, s, ms);
}

int main(){
    union{
        char c[8];
        unsigned long long ull;
    } a;
    int i;
    for (i = 0; i < 8; i ++){
        scanf("%2x", a.c + i);
    }
    win_u64tod(a.ull);
}

示例输入:FB7E5D6A355DD201
示例输出:2016-12-23 15:58:34.6327803(请注意,不添加时区)

参考:DATECONVERT