VB读取二进制文件,请各位大虾帮帮忙!!!

zj420482596 2006-07-19 11:52:33
RDL.bin是从设备内把所有的记录打包生成的一个二进制文件,格式如下,每10个字节为一组数据。卡号3个字节
A1 D1 BE 06 07 19 10 34 10 AA
A1 D1 BE 06 07 19 10 34 14 AE
A1 D1 BE 06 07 19 10 34 19 B3

例如:A1 D1 BE 由低到高。(转成16进制得到卡号)
06 07 19 10 34 10 年月日时分秒
AA 是前面9个字节的和效验。
请问我应该怎么解析这个二进制文件,把包内的记录通过都循环读出来?
...全文
1249 点赞 收藏 24
写回复
24 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
fxy_2002 2006-07-21
vb 有个内置的 kill 命令,用来删除文件的。
回复
zj420482596 2006-07-21
知道了,麻烦各位大哥了
回复
zj420482596 2006-07-21
再请问一下,读完后,如何删除这个文件?
回复
一笑拔剑 2006-07-21
byte3是空字节
所以会这样
你一个一个字节试就知道了
你自己添加吧
回复
fxy_2002 2006-07-21
是 2006 吧?

2006-7-17 15:23:52 已是正确的时间了,显示格式与你的操作系统设置有关。

要它显示完整格式,可以:
?format("2006-7-17 15:23:52","YYYY-MM-DD HH:NN:SS")
2006-07-17 15:23:52
回复
zj420482596 2006-07-21
Dim readByt(9) As Byte
Dim str, time As String
Open "RDL.bin" For Binary As #1
Do While Not EOF(1)
Get #1, , readByt
i = Val("&H" & Hex((readByt(0))))
j = Val("&H" & Hex((readByt(1))))
k = Val("&H" & Hex((readByt(2))))
l = i + j * 256 + k * 65536
time = "20" + Hex((readByt(3))) + "-" + Hex((readByt(4))) + "-" + Hex((readByt(5))) + " " + Hex((readByt(6))) + _
":" + Hex((readByt(7))) + ":" + Hex((readByt(8)))
Debug.Print l
Debug.Print time
Loop
Close #1
得到的时间是这样的:206-7-17 15:23:52,是不是在按字节存放到数组的时候,前面的0就没有保留?请问大哥应该怎么处理?
回复
一笑拔剑 2006-07-20
对的
就是这样

你最终还是要转成10进制的

16进制的你能看明白吗
回复
fxy_2002 2006-07-20
如果你确定只要转成16进制即是卡号,应该:

?val("&H"&hex(readbyt(0))&hex(readbyt(1))hex(readbyt(2)))

但还有可能是分别转成16进制,然后连接:
?hex(readbyt(0))&hex(readbyt(1))hex(readbyt(2))

两种的结果肯定不一样。
所以你必须知道数据来源格式,也就是怎么生成 .bin的,然后才能正确还原。
回复
zj420482596 2006-07-20
Val("&H" + "readByt(0)"+"readByt(1)"+"readByt(2)")
这样能得到卡号?
回复
一笑拔剑 2006-07-20
readByt(0)是值是16进制的
一个字节是八位吧
你自己试下就知道了
不要事事都问
回复
zj420482596 2006-07-20
那请问要读的数据是16进制的,读出来后还会是原来的那个么?A1 D1 BE 取出来的字节数组中readByt(0)会等于A1,readByt(1)会等于D1么?
回复
一笑拔剑 2006-07-20
not eof(1)是一直读取到文件结束
end of file的简写

Get #1, , readByt是以二进制方式读取数据并把每个字节写入readbyt这个数组里
回复
zj420482596 2006-07-20
Dim i, j, k As Integer
Dim l As Long
Dim readByt(9) As Byte
Open "RDL.bin" For Binary As #1
Do While Not EOF(1)
Get #1, , readByt
i = Val("&H" & (readByt(0)))
j = Val("&H" & (readByt(1)))
k = Val("&H" & (readByt(2)))
l = i + j * 256 + k * 65536
MsgBox l
Loop
Close #1
请问这样可不可以行到卡号?Get #1, , readByt这句话是什么意思?还有循环的条件not eof(1)是什么意思?VB没用过,所以菜鸟一个,还请各位大哥别骂我太笨哦
可能之前提的问题错了,应该是生成的文件里面的数据是十六进制的,卡号由低到高
回复
一笑拔剑 2006-07-19
基本上是这样的了
回复
fxy_2002 2006-07-19
循环读取,每次读10个字节,然后丢给一个分析函数去处理这10个字节,按你的规则分解

dim readByt(9) as byte
open "RDL.bin" for binary as #1
do while not eof(1)
get #1,,readByt
call xxxx(readByt) '你的分析函数
loop
close #1
回复
一笑拔剑 2006-07-19
你问的是16进制怎么转换10进制数字吧
Val("&H" + "FF")
回复
fxy_2002 2006-07-19
A1 D1 BE 06 07 19 10 34 10 AA
这本身不就是16进制串码?还要转什么换?

你用 byte() 数组读到后是字节,比如可能是 161,变成 16进制就用 hex() 处理一下后即是 A1 。

至于时间,那你必须知道它是怎么写入的。是放的一个数值,还是放的一个日期格式的字符串?根据来源値的不同进行不同的还原处理。
回复
zj420482596 2006-07-19
dim readByt(9) as byte
open "RDL.bin" for binary as #1
do while not eof(1)
get #1,,readByt
call xxxx(readByt) '你的分析函数
loop
close #1

我的分析函数就是把每行的卡号和时间取出来,请问具体的代码应该怎么写?麻烦各位大哥了
回复
okcome 2006-07-19
阿勇的方法没错。
你用STRING行吗?STRING对于一些控制符是会有问题的,尤其是00这样的值,必须出错。
就用阿勇的方法吧。
回复
zj420482596 2006-07-19
可不可以不用数组啊,string行么?例如取得一行,这样得到卡号
id = Val("&h" + Mid(str, 1, 2) + Mid(str, 3, 2) + Mid(str, 5, 2))
time = "20" + Mid(data1, 7, 2) + "-" + Mid(data1, 9, 2) + "-" + Mid(data1, 11, 2) + " " + Mid(data1, 13, 2) + ":" + Mid(data1, 15, 2) + ":" + Mid(data1, 17, 2)
请问我应该怎么处理?
最好麻烦把代码贴出来哦
回复
加载更多回复
相关推荐
发帖
VB基础类
创建于2007-09-28

7518

社区成员

VB 基础类
申请成为版主
帖子事件
创建了帖子
2006-07-19 11:52
社区公告
暂无公告