【发布时间】:2020-10-13 21:48:36
【问题描述】:
我有一个表示开始时间的二进制文件的一部分。
我正在尝试用 Python 读取文件中的时间/日期值,但遇到了问题。
>>>file = open('file1',"rb")
>>>data = file.read()
>>>data[16:24]
b'Q\xca\rk\x9c\xc6\xd7\x88'
>>>unpacked, = unpack('<Q', data[16:24])
9860568284264254033
我已经知道 16-24 位置包含 8 字节大小的 Int64。
在 C# 中,我可以通过这样做成功获得值 {3/12/2020 11:45:40 AM}
var value = _reader.ReadInt64();
sdatetime = DateTime.FromBinary(value);
有人知道如何在 Python 中正确阅读吗?
如果有帮助的话,
>>> unpack('q',data[16:24])
(-8586175789445297583,)
>>> unpack('Q',data[16:24])
(9860568284264254033,)
我试过了:
>>> unpacked
9860568284264254033
>>> secs = unpacked / 10.0 **7
>>> secs
986056828426.4253
>>> delta = datetime.timedelta(seconds = secs)
>>> delta
datetime.timedelta(days=11412694, seconds=66826, microseconds=425293)
>>> ts = datetime.datetime(1,1,1) + delta
这只是导致溢出错误:日期值超出范围
【问题讨论】:
-
能否请您编辑问题并发布完整代码并展示您如何阅读文件?
-
好吧,从
DateTime.FromBinary()method 上的 C# 文档来看,看起来两位用于存储位置(Kind 属性),其余 62 位是从开头开始的滴答数21世纪。提取这些刻度数并执行一些奇怪的 python datetime.timedelta 数学运算,我相信你可以找出答案。 -
我将发布我尝试过的数学运算,但它弹出错误消息说溢出错误:日期值超出范围
-
@akb515 timedelta 不正确,快速健全性检查表明您正在查看大约 31,267 年的时间增量。找出哪些 62 位用于存储刻度数,确定刻度和秒之间的时间转换,然后对表示 2001 年 1 月 1 日的日期时间对象执行 timedelta。
-
@Zircoz 感谢您的澄清!
标签: python binaryfiles