我想解码windows 64bit十六进制值:C ++中的小端时间。
我有一个值(= FB7E5D6A355DD201),但我不知道如何在C ++中解码这个值。
请告诉我示例代码或相关网站。
答案 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