指南针qmf月库、分析家日库数据的转换成文本文件 (300分)

  • 主题发起人 主题发起人 dsigo
  • 开始时间 开始时间
D

dsigo

Unregistered / Unconfirmed
GUEST, unregistred user!
我要反指南针qmf月库、分析家日库数据的转换成文本文件,不知是不是加过密的,
请网友帮忙。
以下是qmf月库结构
开盘价(头4个字节)为什么是9.67呢?怎么算出来的呀?
51 B8 1A 41 1E 85 1B 41 F5 28 18 41 14 AE 23 41 00 58 18 46 D7 E3 8A 43 70 3D 8A 3F 20000803
开盘价 收盘价 最低价 最高价 流通盘 成交量 除权系数
9.67      9.72   9.51    10.23    9750.00  277.78   1.08

 
没有加密,只不过是把 Single 浮点数以内存中的原始形式保存起来了而已。
type
QMF=record
kp_Pirce,sp_Price,Low_Price,High_Price,lt,cj,cq:Single;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
a:QMF;
begin
a.kp_Pirce:=9.67;
a.sp_Price:=9.72;
a.Low_Price:=9.51;
a.High_Price:=10.23;
a.lt:=9750.00;
a.cj:=277.78;
a.cq:=1.089;
Caption:='';
//在此处设置断点
end;

运行之后,点击Button1,在断点处按下 Ctrl+Alt+W, 添加监视变量 a, Repeat Count
设定为28,类型设定为 Memory Dump。 你就可以看见结构变量 a 在内存中的数据——一摸
一样!
你只要把它当作记录文件进行读取就可以了。
 
to creation-zy
真是太好了,以前我看过这些数据,就是搞不定,谢谢了。
 
creation-zy 谢谢!
那你知不知道分析家的日库文件是不是也是这样写的?
你是不是知道qmh文件的格式?
 
我没有研究过股票的数据格式。我只是根据你给出的 51 B8 1A 41 => 9.67 的关系进行判断的。
我做了一个小工具,可以实现 Integer,Single,Double,String到2..36进制的任意转换:
String: R?A
Dec: 1092270162
Hex: 52B81A41
Single: 9.67
Double: 5.39653163021653E-315
2进制: 1000001000110101011100001010010
16进制: 411AB852
36进制: I2B51U
——哈哈!
 
你可以把你的工具也给我一份吗? 我想把这个问题结速了。
 
your mail?
< 800KB
 
我的e-mail是: dsigo@163.net 或 ketaiks@public1.sz.js.cn
如果分值不够我可以别外再给。

00000000h: 8C 19 FC 33 9C 2D 00 00 22 06 00 00 00 00 00 00
00000010h: FF FF FF FF 53 48 31 41 30 30 30 31 00 F5 80 00
00000020h: 9A C8 C3 A5 C9 CF D6 A4 D6 B8 CA FD 00 2B 50 00
00000030h: 80 9C 3C 3D D5 9C D1 44 D5 94 D2 44 31 CC D0 44
00000040h: 8D 3B D1 44 1C 75 E2 4A D1 EC C5 4F BB 00 08 02
00000050h: FF FF FF FF 53 48 31 41 30 30 30 32 00 CC D0 44
00000060h: 9A C8 C3 A5 A3 C1 B9 C9 D6 B8 CA FD 00 00 08 02
00000070h: 80 9C 3C 3D 3F B9 DA 44 CE BB DB 44 C4 DC D9 44
00000080h: 3F 51 DA 44 FC B8 BF 4A 12 CE C2 4F 00 00 00 00
00000090h: FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00
000000a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
以上是一记录文件的内容,我在为记录读出的时候遇上了问题。
格式说明(以行开始位为单位):
 00000000h 文件头 16字节
 00000010h-00000040h 记录1 64字节
 00000050h-00000080h 记录2 64字节
 00000090h-000000a0h 结束标志 32字节
 
问题1: 是不是一定要把文件去头去尾后才能以记录方试读出,如果
不是我该怎么做?
问题2: 现在我定义了以下记录结构,能够读出部份数据,请帮忙改写或
重写以下结构代码,使其正确完整读出。
变量a0本来是读FF FF FF FF的,为何我只有设2位才能正确读
后面的数据,还有a2、a4是什么数据值?
type
strday = record
a0: string[2]; // 未知 [FF FF FF FF]
Code: string[8];
// 代码 [53 48 31 41 30 30 30 31]
a2: string[6];
// 未知 [00 F5 80 00 9A C8 C3 A5]
Name: string[8];
// 名称 [C9 CF D6 A4 D6 B8 CA FD]
a4: string[4];
// 未知 [00 2B 50 00 80 9C 3C 3D]
Open: single;
// 开盘 [D5 9C D1 44]
High: single;
// 最高 [D5 94 D2 44]
Low: single;
// 最低 [31 CC D0 44]
Close: single;
// 收盘 [8D 3B D1 44 ]
cjl: single;
// 成交量 [1C 75 E2 4A]
cje: single;
// 成交额 [D1 EC C5 4F]
a11: single;
// 未知 [BB 00 08 02]
end;

我读出后的数据内容如下:
Code Name Open High Low Close cjl cje
记录1 SH1A0001 上证指数 1676.90 1684.65 1670.38 1673.86 7420558 6641263104
记录2 SH1A0002 A股指数 1749.79 1757.87 1742.90 1746.54 6282366 6536569856
 
谢谢,你的邮件已收到,以上还有的问题是不是有空也可以帮我看看。
 
正在看——为了直接把你给出的16进制的信息写入文件,我正在扩展 filetool 的功能。
1. 不一定非要用记录文件,可以用普通文件+BlockRead
2. 在用于读取文件内容的记录中不能使用 String 这样的特殊数据类型,应该用 array[0..x] of char;
 
type
strday = record
a0: array[0..3]of char; // 未知 [FF FF FF FF]
Code: array[0..7]of char;
// 代码 [53 48 31 41 30 30 30 31]
a2: array[0..7]of char;
// 未知 [00 F5 80 00 9A C8 C3 A5]
Name: array[0..7]of char;
// 名称 [C9 CF D6 A4 D6 B8 CA FD]
a4: array[0..7]of char;
// 未知 [00 2B 50 00 80 9C 3C 3D]
Open: single;
// 开盘 [D5 9C D1 44]
High: single;
// 最高 [D5 94 D2 44]
Low: single;
// 最低 [31 CC D0 44]
Close: single;
// 收盘 [8D 3B D1 44 ]
cjl: single;
// 成交量 [1C 75 E2 4A]
cje: single;
// 成交额 [D1 EC C5 4F]
a11: single;
// 未知 [BB 00 08 02]
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Fs:TFileStream;
TempBuf:array[0..255]of Byte;
P:^strday;
begin
P:=@TempBuf[0];
Fs:=TFileStream.Create('e:/a.dat',fmOpenRead);
Fs.Seek(16,soFrombegin
ning);
Fs.Read(TempBuf,64);
Caption:=Format('%s %s %f %f %f %f',[P^.Name,P^.Code,P^.Open,P^.High,P^.Low,P^.Close]);
Fs.Read(TempBuf,64);
Caption:=Caption+' '+Format('%s %s %f %f %f %f',[P^.Name,P^.Code,P^.Open,P^.High,P^.Low,P^.Close]);
Fs.Free;
end;
 
接受答案了.
 
creation-zy:
感谢你独到的见解。可以把你的转换工具也给我发一份吗?
email:ivyrich@21cn.com
 
http://www24.brinkster.com/creationzy/prg/FileTool.zip
 
谢谢!
:)
 
后退
顶部