| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1362 人关注过本帖
标题:一个二进制读文件的例子
只看楼主 加入收藏
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4941
专家分:30047
注 册:2008-10-15
结帖率:100%
收藏
 问题点数:0 回复次数:2 
一个二进制读文件的例子
Option Explicit

Public Const 文件头大小 As Long = &H7B              '文件头大小
Public Const 起始偏移   As Long = &H7C              '开头偏移
Public Const 每节长度 As Long = &HC5C               '每个人物的数据长度
Public Const 人物总数位置 As Long = &H69                '文件中人物的总数


Public Const 人物名字位置 As Long = 13              '人物名
Public Const 人物等级位置 As Long = 73              '等级
Public Const 人物经验位置 As Long = 97              '经验
Public Const 人物锻造等级位置 As Long = &HA4              '等级
Public Const 人物锻造经验位置 As Long = &HA1              '锻造经验
Public Const 帐号位置 As Long = &H100               '帐号位置
Public Const 声望位置 As Long = &HC3D               '声望位置
Public Const 职业位置 As Long = &H44               '职业位置

Public Type 人物数据结构
    原数据(1 To 每节长度) As Byte
    人物名 As String
    等级 As Long
    经验 As Long
    锻造等级 As Byte
    锻造经验 As Long
    所属帐号 As String
    声望 As Integer
    职业 As Byte
End Type

Public 职业说明(0 To 2) As String


Public 文件头(1 To 起始偏移) As Byte
Public 总数 As Long
Public 人物() As 人物数据结构

'复制内存, 目标变量 ,原变量 ,复制字节数. 注意前二个变量是传值的.所以不能使用 string 变长 变量给函数.
'string 变长 内存中是存放一个地址,然后这个地址指向真正的数据.可以转化为 byte() 数组进行复制
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)


Public Sub 读数据(DBPATH As String)

Dim fr As Long            '取空的文件号
fr = FreeFile

Dim i As Long
Dim s() As Byte

Open DBPATH For Binary As #fr
   
    Get #fr, , 文件头
     
    CopyMemory 总数, 文件头(人物总数位置), 4            '指 byte 数组中的 指定位置的 连续 4个字节,转化为一个 long 数据
   
    ReDim 人物(1 To 总数)
   
    For i = 1 To 总数
        Get #fr, , 人物(i).原数据            '存储方式: 长度(byte) + 数据(数据长度由前面的长度确定)
        ReDim s(人物(i).原数据(人物名字位置))
        CopyMemory s(0), 人物(i).原数据(人物名字位置 + 1), (人物(i).原数据(人物名字位置))              '复制指定的位置的字符串出来

        人物(i).人物名 = StrConv(s, vbUnicode)                                    'ANSI 转 Unicode
        人物(i).人物名 = Left(人物(i).人物名, Len(人物(i).人物名) - 1)            '去掉尾 &H00 ,C语言的字符串结尾
        
        人物(i).等级 = 人物(i).原数据(人物等级位置)
        
        CopyMemory 人物(i).经验, 人物(i).原数据(人物经验位置), 4                  '4 byte 转 long
        
        CopyMemory 人物(i).锻造经验, 人物(i).原数据(人物锻造经验位置), 3          '3 byte 转 long ,最高位不转,就是默认的为0
        人物(i).锻造等级 = 人物(i).原数据(人物锻造等级位置)
        
        ReDim s(人物(i).原数据(帐号位置))
        CopyMemory s(0), 人物(i).原数据(帐号位置 + 1), (人物(i).原数据(帐号位置))
        人物(i).所属帐号 = StrConv(s, vbUnicode)
        人物(i).所属帐号 = Left(人物(i).所属帐号, Len(人物(i).所属帐号) - 1)
        
        CopyMemory 人物(i).声望, 人物(i).原数据(声望位置), 2                        '3byte 转 Integer
        人物(i).职业 = 人物(i).原数据(职业位置)
    Next i
   
'Stop
Close #fr

End Sub

-------------------------------------
今天刚弄的,算一下比较复杂的例子吧.
读 有格式的二进制文件,然后按里面的偏移量来取各个数值.
然后转化为指定类型的变量

搜索更多相关主题的帖子: 文件 例子 二进制 
2010-02-10 22:48
数据包
Rank: 1
等 级:新手上路
帖 子:11
专家分:4
注 册:2010-2-10
收藏
得分:0 
没人看我顶下
2010-02-11 12:11
幸运之星
Rank: 4
来 自:吉林
等 级:业余侠客
帖 子:275
专家分:239
注 册:2009-6-5
收藏
得分:0 
帮你顶
2010-02-24 21:06
快速回复:一个二进制读文件的例子
数据加载中...
 
   



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

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