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