标题:如何读取二进制文件的内容,并转换?
取消只看楼主
sh600839
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2005-8-30
结帖率:100%
 问题点数:0 回复次数:12 
如何读取二进制文件的内容,并转换?
读取股票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
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
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
sh600839
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2005-8-30
得分:0 
以下是引用TonyDeng在2012-5-12 13:57:45的发言:

在电脑中,字符'A'储存的二进制就是01000001,也可用十六进制0x41表示,这三种表示形式是完全一样的,都是同一个东西。因此你读入的a4字符chr(0xbf)其实已经是用0xbf储存的了,再asc(a4)是不需要做什么的。
斑竹我还是不太懂啊,就下面的到底如何写代码?我要从BF 03 33 01 得到20120511 。

例如:数据文件的16进制内容为:
        BF 03 33 01 ......
日期为:01 33 03 BF,16进制 0x013303BF =20120511  

*************
用&宏替换?
sh600004.rar (434 Bytes)


[ 本帖最后由 sh600839 于 2012-5-12 14:06 编辑 ]
2012-05-12 14:04
sh600839
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2005-8-30
得分:0 
以下是引用taohua300在2012-5-12 14:03:22的发言:

最好上传一下你的文件

也好具体分析么

印象中我还没哟见过二进制文件

楼主也让我多见识一下
附件在二楼上传了,这个文件共32字节是1天的行情数据。
我要一个将它转换成txt文件的代码。
2012-05-12 14:14
sh600839
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2005-8-30
得分:0 
以下是引用taohua300在2012-5-12 14:13:54的发言:

4321 ctobin第二个参数的r已经说明了要将顺序翻转,s说明符号不处理,4说明4个字节
根据你上传的文件,读取前4个字符,转换后就是你要的日期
my = Fopen("sh600004.day")
lcBinary =Fread(my,4)
? Ctobin(lcBinary,'4rs')
? Ctobin(lcBinary,'4rs')

我的系统是vfp5.0,运行后显示参数太多,帮助文件也没有参数说明,是不是升级版本改进了函数?
2012-05-12 14:18
sh600839
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2005-8-30
得分:0 
以下是引用TonyDeng在2012-5-12 14:17:51的发言:

你1楼的代码已经足够了
1楼代码的确可以,但是我感觉太笨了。这是股票行情数据,应该读取很快的。

my = Fopen("sh600004.day")
lcBinary =Fread(my,4)
?lcBinary
? Ctobin(lcBinary,'4rs')   &&这个感觉不错,但是我的vfp5.0不能用。

2012-05-12 14:21
sh600839
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2005-8-30
得分:0 
以下是引用taohua300在2012-5-12 14:20:41的发言:

共 32 个字节,每4个字节表示一个字段么 ?
我按每4个字节一次读取
结果如下
20120511
728
733
726
729
1259584443
1326338
0
估计后面3个字段读取有问题
1326338 是成交量,正确的结果
1259584443 是成交金额(转换不正确),这是个浮点数,正确的值应该是967万。

浮点数怎么转?一点不懂

bintoc()在vfp5.0也有,但是没看到参数说明。

谢谢论坛里的朋友。
2012-05-12 14:26



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




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

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