Jet4 中的 DateTime 和 Number 格式是如何编码的?

How are DateTime and Number formats encoded in Jet4?

我正在编写一个低级工具来扫描损坏的 Jet4 MDB 文件并从中恢复数据。我正在扫描页面、解析行和解码列。

如果我有日期时间字段的原始 8 字节值,如何将其转换为日期的字符串表示形式,例如 "MM-DD-YY HH:MM:SS"?

如果我有一个数字字段的原始 4 字节值,具有单个字段大小和 3 个小数位,我如何将这个值转换为 float/double?

是否有任何文档描述了所有访问字段是如何编码和存储在磁盘上的?

谢谢。

没有。 JET 格式为 Microsoft 专有且未记录。

至于 Date 数据类型,这只是一个 double。

double 和 single 都不携带格式。正如您提到的,这些是标准浮点值。

If I have the raw 8 byte value for Datetime fields, how can I convert this to a string representation of the date such as "MM-DD-YY HH:MM:SS"?

A​​ccess 将 Date/Time 值存储为小端格式的 64 位(8 字节)Double 值。整数部分代表访问前后的天数"epoch"(1899-12-30 00:00:00)小数部分绝对值代表时间部分那天(例如,0.5 = 中午)。因此,例如,在 Python 中,我们会将字节转换为 datetime 值,如下所示:

from datetime import datetime, timedelta
import struct

# bytes as retrieved from .accdb or .mdb file
d_as_bytes = b'\x35\x07\x2F\x2C\x93\x63\xDD\xC0'

d_as_double = struct.unpack('<d', d_as_bytes)[0]  # -30094.29957175926
d_integer_part = int(d_as_double)  # -30094
d_fractional_part = abs(d_as_double - d_integer_part)  # 0.29957175926
access_epoch = datetime(1899, 12, 30)
d = access_epoch + timedelta(days=d_integer_part) + timedelta(days=d_fractional_part)
print(d)  # 1817-08-08 07:11:23