【问题标题】:Hex numbers that translate into date and time stamps转换为日期和时间戳的十六进制数字
【发布时间】:2019-05-09 21:21:32
【问题描述】:

我有一个程序以 BLOB 格式将数据存储在 SQLite 数据库中。

此 BLOB 字段中包含的部分数据是日期和时间设置。

我正在尝试了解此日期和时间的格式。

我无法访问程序的实际代码,我只能访问 SQLite 数据库以观察所做的更改。

例如,如果我将程序的日期和时间设置为 2019-05-09-0500PM,则十六进制代码似乎是:

25 83 F5 03 A5 D6 80

我已经使用日期和时间设置来查看存储在数据库中的内容,但我无法弄清楚这是什么类型的时间戳。

以下是我观察我对程序中的日期和时间设置所做的每次更改的一些示例设置:

Actual date and time    HEX code
2019-05-09 - 0400 PM    25 83 F5 03 6E E8 00
2019-05-09 - 0500 PM    25 83 F5 03 A5 D6 80
2020-05-09 - 1100 PM    25 83 F5 04 EF 6D 80
2019-05-10 - 1200 AM    25 83 F6 00 00 00 00
2019-05-10 - 0300 AM    25 83 F6 00 A4 CB 80
2019-05-10 - 0400 AM    25 83 F6 00 DB BA 00
2019-05-10 - 0400 PM    25 83 F6 03 6E E8 00
2019-06-09 - 0400 PM    25 84 14 03 6E E8 00
2020-05-09 - 0400 PM    25 85 63 03 6E E8 00

有谁知道这是什么格式以及如何将我自己的新日期和时间写入这个 BLOB 字段?

程序在 Windows 10 上运行。

【问题讨论】:

  • 我怀疑前 3 个字节编码日期,后 3 个字节编码时间,但中间的字节可以采用任何一种方式。可以包含一些 AM 时间戳吗?
  • 我添加了一些附加信息。
  • 谢谢。你还能得到2019-05-09-1159PM2019-05-10-1200AM 的值吗?
  • 我不能给你分钟或秒的任何东西,只有整个小时。这是我试图破译这个时间戳的部分原因。我希望写一些代码来添加更准确的时间戳。

标签: sqlite timestamp unix-timestamp timestamp-with-timezone sql-timestamp


【解决方案1】:

0x2583F503A5D680 - 0x2583F5036EE800,相隔 1 小时乘以 3600000。一小时有 3600 秒,因此一小时有 3600000 毫秒。那么也许时间的跟踪毫秒数?

0x2583F6036EE800 - 0x2583F600DBBA00,相隔 12 小时,是 43200000。这也意味着毫秒。

但是...0x2583F6036EE800 - 0x2583F5036EE800,相隔 24 小时,是 4294967296。但是,24 小时有 86400000 毫秒。并且 4294967296 不能被 24 整除。很好奇。但是...0x2583F6 - 0x2583F5 是 1,0x036EE800 - 0x036EE800 当然是 0。所以它看起来像前三个字节跟踪日期,最后 4 个计算自当天开始以来的毫秒数? 0x03A5D680 是 61200000,这也是 3600000 * 17,所以如果是这样的话,它应该是下午 5 点。我们正在做某事!

0x258563 - 0x2583F5,2019 年和 2020 年相隔 1 年,是 366 天。2020 年是闰年,所以它不是 365 年是有道理的,并有助于证实这一关于格式的理论。

0x2583F5 在此格式中是自 0 点以来的 2458613 天。那大约是6735年。 Julian Day 计数器的开始日期是 4713BC(或 4714BC,具体取决于您使用的日历)。这听起来像是一场比赛!

来自维基百科:

儒略日期表示为儒略日数,并添加小数

所以看起来这是儒略日期的二进制编码,使用毫秒表示一天中的时间。我不知道为什么作者不使用REAL 值将其存储在sqlite 数据库中,特别是因为这将使sqlite 的date and time functions 可以使用它。让我们用它们来验证:

sqlite> select julianday('2019-05-09 17:00:00');
2458613.208333333

与 blob 中的同一天数。所以你去。格式:

  • 3 个字节将儒略日记录为 bigendian 整数。
  • 4 个字节,将自一天开始以来的毫秒数记录为 bigendian 整数。

【讨论】:

  • 哇,就是这样。谢谢!
  • @Aaron 我希望逆向工程过程的描述有助于如何处理未来未知的奇怪值。寻找它们与它们所代表的事物之间的模式和一致性(或不一致性),进行猜测和测试等等。不过,对朱利安时代足够熟悉,认为这是一种可能性,这纯粹是运气。
猜你喜欢
  • 1970-01-01
  • 2022-09-29
  • 2015-03-12
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
相关资源
最近更新 更多