我正在编写一个低级工具来扫描和恢复损坏的Jet4 MDB文件中的数据。我正在浏览页面,解析行和解码列。
如果我有Datetime字段的原始8字节值,我该如何将其转换为日期的字符串表示,例如" MM-DD-YY HH:MM:SS"?
如果我有一个具有单个字段大小和3个小数位的数字字段的原始4字节值,我该如何将该值转换为float / double?
是否有任何文档描述了所有访问字段如何编码并存储在磁盘上?
谢谢。
答案 0 :(得分:2)
如果我有Datetime字段的原始8字节值,如何将其转换为日期的字符串表示形式,例如“MM-DD-YY HH:MM:SS”?
Access以小端格式将日期/时间值存储为64位(8字节)Double
值。整数部分表示Access“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
答案 1 :(得分:0)
没有。 JET格式是Microsoft专有的,没有记录。
至于Date数据类型,这只是一个双倍。
双重或单一都不带格式。如您所述,这些是标准浮点值。