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个字节的和效验。
请问我应该怎么解析这个二进制文件,把包内的记录通过都循环读出来?

解决方案 »

  1.   

    循环读取,每次读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
      

  2.   


    fxy_2002(阿勇) 代码好象有点小问题~应该是open "RDL.bin" for binary access read as #1
      

  3.   

    你应该修改路径嘛!open "RDL.bin" for binary as #1改成:
    open "c:\RDL.bin" for binary as #1如果是当前exe目录,则是:
    open replace(app.path &"\RDL.bin","\\","\") for binary as #1
      

  4.   

    可不可以不用数组啊,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)
    请问我应该怎么处理?
    最好麻烦把代码贴出来哦
      

  5.   

    阿勇的方法没错。
    你用STRING行吗?STRING对于一些控制符是会有问题的,尤其是00这样的值,必须出错。
    就用阿勇的方法吧。
      

  6.   

    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我的分析函数就是把每行的卡号和时间取出来,请问具体的代码应该怎么写?麻烦各位大哥了
      

  7.   

    A1 D1 BE 06 07 19 10 34 10 AA 
    这本身不就是16进制串码?还要转什么换?你用 byte() 数组读到后是字节,比如可能是 161,变成 16进制就用 hex() 处理一下后即是 A1 。至于时间,那你必须知道它是怎么写入的。是放的一个数值,还是放的一个日期格式的字符串?根据来源値的不同进行不同的还原处理。
      

  8.   

    你问的是16进制怎么转换10进制数字吧
     Val("&H" + "FF")
      

  9.   

    Val("&H" + "readByt(0)"+"readByt(1)"+"readByt(2)")
    这样能得到卡号?
      

  10.   

    如果你确定只要转成16进制即是卡号,应该:?val("&H"&hex(readbyt(0))&hex(readbyt(1))hex(readbyt(2)))但还有可能是分别转成16进制,然后连接:
    ?hex(readbyt(0))&hex(readbyt(1))hex(readbyt(2))两种的结果肯定不一样。
    所以你必须知道数据来源格式,也就是怎么生成 .bin的,然后才能正确还原。
      

  11.   

    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没用过,所以菜鸟一个,还请各位大哥别骂我太笨哦
    可能之前提的问题错了,应该是生成的文件里面的数据是十六进制的,卡号由低到高
      

  12.   

    not eof(1)是一直读取到文件结束
    end of file的简写Get #1, , readByt是以二进制方式读取数据并把每个字节写入readbyt这个数组里
      

  13.   

    那请问要读的数据是16进制的,读出来后还会是原来的那个么?A1 D1 BE 取出来的字节数组中readByt(0)会等于A1,readByt(1)会等于D1么?
      

  14.   

    readByt(0)是值是16进制的
    一个字节是八位吧
    你自己试下就知道了
    不要事事都问
      

  15.   

    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就没有保留?请问大哥应该怎么处理?
      

  16.   

    是 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
      

  17.   

    byte3是空字节
    所以会这样
    你一个一个字节试就知道了
    你自己添加吧
      

  18.   

    vb 有个内置的 kill 命令,用来删除文件的。