读取悖论时间戳字段
Posted
技术标签:
【中文标题】读取悖论时间戳字段【英文标题】:Read paradox timestamp field 【发布时间】:2018-09-19 08:29:11 【问题描述】:我正在阅读一个带有 .DB 扩展名的 paradox 文件。我已成功读取标题和记录,但时间戳类型有一些问题。 时间戳占用 8 个字节,格式如下:
浮点字段,其中整数部分是自一月以来的天数 1、0001,小数部分是时间——表示为 一天的比例。例如,下午 6:00 将是 0.75,因为它是 午夜过后的 3/4。
我已经阅读了日期类型(自 0001 年 1 月 1 日以来的天数)。我知道以下两个:
1 10000101100 1100111100010110100010001100111000010010101010000000 > 14/11/2017 09:05:18
1 10000101100 1100111010011000001111011111111100101100000000000000 > 21/09/2015 15:01:39
我有以下代码:
#include <math.h>
#include <cmath>
union Converter uint64_t i; double d; ;
std::bitset<64> timestamp(0);
double intpart, fractpart;
for (int i = 0; i<end-start; i++)
timestamp <<= 8;
timestamp ^= (unsigned char)(buffer[start+i]);
fractpart = modf(convert(timestamp.to_ullong()),&intpart);
unsigned long int test = (unsigned long int)intpart;
std::cout<<test;
对于整数部分返回 786841003,这个数字太大了,甚至除以 1000。
编辑:
std::cout<<std::fixed<<'\n'<<convert(timestamp.to_ullong());
std::cout<<std::fixed<<'\n'<<intpart;
-63578530899343.000000
-63578530899343.000000
我没有任何小数部分,我可能以错误的顺序读取字节?
【问题讨论】:
你为什么要玩这些花哨的小玩意儿。它是双精度数,使用标准方法获取双精度数的整数部分和小数部分 ***.com/questions/23993898/… 【参考方案1】:阅读方式不对: 时间戳是从 1/1/0001 开始的毫秒数的两倍,所以我将它转换为这样:
double tmsDouble = abs(convert(timestamp.to_ullong()));
long long int tms= (long long int)tmsDouble ;
std::cout<<'\n'<<((tms/(86400*1000))-719163)*86400;
我得到一个标准的纪元时间。 719163 是 1/1/1970 和 1/1/0001 之间的天数。
【讨论】:
以上是关于读取悖论时间戳字段的主要内容,如果未能解决你的问题,请参考以下文章