【问题标题】:How decode windows 64bit hex value : little endian time?如何解码 Windows 64 位十六进制值:小端时间?
【发布时间】:2017-05-06 07:44:43
【问题描述】:

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

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

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

【问题讨论】:

  • 目标类型是什么?双精度、无符号长整型、长整型?
  • 目标类型是char[8]。如果你愿意,也许我可以改变。我从文件中取出 8 个字节。
  • 所以您是说要将每对十六进制数字转换为相应的字符?在这种情况下,字节顺序无关紧要。无论如何,只需使用基数为 16 的 stoi。如果您想要更大的整数,则通过 endian changing functions (posix) 之一转换最终结果。
  • @freakish umm .. 实际上没有。我想将一个值(=FB7E5D6A355DD201)解码为时间(2016-12-24 Sat. 00:58:34)。
  • @LeeSJ 伙计,你应该更准确地确定你想要实现的目标。您的帖子中没有时间提及。然后你谈论char[8]。现在是时候了。时间是什么?如time_t 结构?还是std::chrono::time_point?要不然是啥?初始缓冲区究竟是如何编码的?解析不仅仅是“我想要这个”,你必须知道源格式和目标格式。另外我假设我们都不知道这个 DCode 软件做了什么。

标签: c++ time decode


【解决方案1】:

在 unix 系统中,日期/时间通常(但不总是)记录为 32 位整数,表示自 Epoch(1970 年 1 月 1 日 00:00:00)以来过去的秒数。但对于 Windows 64 位 LE 格式,这意味着“自 00:00:00.000,000,0 Jan 1, 1601 以来过去 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

【讨论】:

  • 非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多