标题:如何读取二进制文件的内容,并转换?
只看楼主
sh600839
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2005-8-30
结帖率:100%
 问题点数:0 回复次数:38 
如何读取二进制文件的内容,并转换?
读取股票K线的存盘数据文件,提取数据进行二次分析。
现在知道数据文件每32个字节记录1天K线资料,其中1-4字节表示日期,5-8字节表示开盘价,....(字节排序要倒过来换算)
例如:数据文件的16进制内容为:
        BF 03 33 01   D8 02 00 00 ......
日期为:01 33 03 BF,16进制 0x013303BF =20120511   (日期)
开盘为:00 00 02 D8,16进制 0x000002D8 =728       (开盘价格为7.28)

我处理的方法如下(已转换日期为例):
my=fopen("sh600004.day")
a1=fread(my,1)  &&第一个字节,是十六进制BF对应的ASC字符
a2=fread(my,1)  &&第二字节
a3=fread(my,1)  &&第三字节
a4=fread(my,1)  &&第四字节
mydate=asc(a4)*256*256*256+asc(a3)*256*256+asc(a2)*256+asc(a1)  &&结果为20120511
**第四字节的asc数字 乘256 x 256 x 256  + 第三字节x256x256 + ......

虽然用以上方法可以得出正确结果,但是太笨了,肯定有捷径的,bintoc()、ctonbin()都不懂什么意思。

从没用过底层文件也不会用其他编程语言,就上面的代码都琢磨了几个小时,请斑竹指点指点。可怜俺没有分送啊。






搜索更多相关主题的帖子: 数据 开盘 十六进制 二进制 如何 
2012-05-12 12:55
sh600839
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2005-8-30
得分:0 
sh600004.rar (433 Bytes)

附件用Hedit查看,附件在12楼。这是通达信股票系统的日K先存盘文件。我想读取记录一定有很快捷的方法。
数据结构每4个字节表示应该如下:
日期
开盘
最高
最低
收盘
成交金额   (这个是浮点数,怎么转换?)
成交量
保留

HEdit.rar (182.5 KB)


[ 本帖最后由 sh600839 于 2012-5-12 14:31 编辑 ]
2012-05-12 12:58
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
得分:0 
回复 楼主 sh600839
最好能将原始数据文件上传,并注明数据文件的格式
VFP9命令窗口下
?0x000002D8,0x013303BF,0xbf
看下结果

[ 本帖最后由 bccn201203 于 2012-5-12 13:31 编辑 ]
2012-05-12 13:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
正路就是这样提取数据的,没有更简捷的方法,用什么函数,其内部代码终归都是使用这个公式来做。你看到使用了asc()函数,实际上VFP中这个函数没做什么,asc(a4)直接就是读进来的十六进制0xbf,你写出的表达式,VFP运算的就是0x01*256*256*256+0x33*256*256+0x03*256+0xbf=20120511

授人以渔,不授人以鱼。
2012-05-12 13:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
你这样fread(my,1)逐个字符读取,文件读写次数多了,效率会降低,一次读取4个字节fread(my,4)甚至32个字节一组记录,再对内存中的字符串进行处理,减少外设操作,效率会稍微提高一点,不过如果文件不是很大的话,差别不明显。

授人以渔,不授人以鱼。
2012-05-12 13:35
taohua300
Rank: 12Rank: 12Rank: 12
来 自:光
等 级:贵宾
威 望:14
帖 子:1636
专家分:3906
注 册:2009-3-11
得分:0 
试试

1. lcBinary = fread(my,4)
? ctobin(lbBinary,'4rs')

个性太多,无法显示
2012-05-12 13:44
sh600839
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2005-8-30
得分:0 
以下是引用bccn201203在2012-5-12 13:23:32的发言:

最好能将原始数据文件上传,并注明数据文件的格式
VFP9命令窗口下?0x000002D8,0x013303BF,0xbf看下结果
我不能上传附件,数据文件的内容十分简单,就是二进制串,如我主贴所写的。
0x000002D8,0x013303BF能够得到我要的结果,但是我不知道如何简单地从数据文件里提取这些原始数据。我用的笨方法fread()、asc()然后再计算。
2012-05-12 13:51
sh600839
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2005-8-30
得分:0 
以下是引用taohua300在2012-5-12 13:44:46的发言:

试试

1. lcBinary = fread(my,4)
? ctobin(lbBinary,'4rs')
ctobin(lcBinary,'4rs') 参数不对
ctobin(lcBinary) 不是我要的结果

数据文件里的数据顺序要倒过来的, 要4321字节排序才能是正确结果。

每次都要输入验证码,呜呜呜呜

 
2012-05-12 13:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
在电脑中,字符'A'储存的二进制就是01000001,也可用十六进制0x41表示,这三种表示形式是完全一样的,都是同一个东西。因此你读入的a4字符chr(0xbf)其实已经是用0xbf储存的了,再asc(a4)是不需要做什么的。

授人以渔,不授人以鱼。
2012-05-12 13:57
sh600839
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2005-8-30
得分:0 
以下是引用TonyDeng在2012-5-12 13:35:58的发言:

你这样fread(my,1)逐个字符读取,文件读写次数多了,效率会降低,一次读取4个字节fread(my,4)甚至32个字节一组记录,再对内存中的字符串进行处理,减少外设操作,效率会稍微提高一点,不过如果文件不是很大的话,差别不明显。

这个主意好,我一次读32个字节刚好是一天的完整记录,然后再处理。
2012-05-12 13:59



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-367387-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.076752 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved