【发布时间】:2011-03-11 07:35:45
【问题描述】:
我需要从二进制文件中提取金融价格数据。此价格数据通常由一段 C# 代码提取。我遇到的最大问题是获得有意义的日期时间。
二进制数据如下所示:
'\x14\x11\x00\x00{\x14\xaeG\xe1z(@\x9a\x99\x99\x99\x99\x99(@q=\n\xd7\xa3p(@\x9a\x99\x99\x99\x99\x99(@\xac\x00\x19\x00\x00\x00\x00\x00\x08\x01\x00\x00\x00"\xd8\x18\xe0\xdc\xcc\x08'
正确提取出来的C#代码是:
StockID = reader.ReadInt32();
Open = reader.ReadDouble();
High = reader.ReadDouble();
Low = reader.ReadDouble();
Close = reader.ReadDouble();
Volume = reader.ReadInt64();
TotalTrades = reader.ReadInt32();
Timestamp = reader.ReadDateTime();
这就是我在 python 中得到的地方。我对此有一些担忧。
In [1]: barlength = 56; barformat = 'i4dqiq'
In [2]: pricebar = f.read(barlength)
In [3]: pricebar
Out[3]: '\x95L\x00\x00)\\\x8f\xc2\xf5\xc8N@D\x1c\xeb\xe26\xcaN@\x7fj\xbct\x93\xb0N@\xd7\xa3p=\n\xb7N@\xf6\xdb\x02\x00\x00\x00\x00\x00J\x03\x00\x00\x00"\xd8\x18\xe0\xdc\xcc\x08'
In [4]: struct.unpack(barformat, pricebar)
Out[4]:
(19605, # stock id
61.57, # open
61.579800000000006, # high
61.3795, # low
61.43, # close
187382, # volume -- seems reasonable
842, # TotalTrades -- seems reasonable
634124502600000000L # datetime -- no idea what this means!
)
我使用了python内置的struct module,但有些担心。
我不确定 C# 代码中的 Int32 和 Int64 对应的格式字符是什么,尽管多次尝试返回相同的 python 元组。
我很担心,因为某些字段的输出似乎对我指定的格式不是很敏感:例如,如果我将 TotalTrades 字段指定为已签名or unsigned int OR signed or unsigned long (l, L, i, or I)
我无法理解日期返回字段。这其实是我最大的问题。
【问题讨论】:
-
能贴出C#阅读器类的源码吗?