none
以VB.NET讀取VB6所寫之二進位檔案 RRS feed

  • 問題

  • 請問各位專家 :
    我想以VB.NET寫程式讀取一些二進位記錄檔. 這些紀錄檔是以如下結構寫成 :

    Type DataStruc
        TimeStamp As Date
        Msg As String * 100
    End Type
    Function WriteLogbyVB6()
        ' .........
        Dim Log As DataStruc
        Log.TimeStamp = Now
        Log.Msg = "for test2." 'for exam
        ' .........
        Dim fp&
        fp = FreeFile()
        Open "c:\Data.log" For Binary As #fp
        Seek #fp, LOF(fp) + 1
        Put #fp, , Log
        Close
    End Function
    '------------------------------------------------
    我試著在VB2005.NET用FileGet 來讀取.
    LogDate可以讀出來, 沒有問題. (雖說, 寫起來不太像是.NET風格)
            Dim fp As Integer = 1
            Dim LogDate As DateTime, LogMsg As String, buf(99) As Byte
            Microsoft.VisualBasic.FileOpen(fp, "c:\Data.log", OpenMode.Binary)
            Microsoft.VisualBasic.FileGet(fp, LogDate)
            '' ??? Microsoft.VisualBasic.FileGet(fp, buf)
            Microsoft.VisualBasic.FileClose(fp)
    若以如下.NET寫法, 字串訊息部分沒問題. 可以正確讀出來.
    但是 ...問題是:  要如何讀取時間(TimeStamp) 到  VB.NET 之DateTime 變數內 ??
            Using br As New BinaryReader(New FileStream("c:\Data.log", FileMode.Open))
                Dim TimeBuf(7) As Byte, MsgBuf(99) As Byte
                br.Read(TimeBuf, 0, TimeBuf.Length)
                br.Read(MsgBuf, 0, MsgBuf.Length)
                '
                Debug.Print(System.Text.UTF8Encoding.UTF8.GetString(MsgBuf)) 'LogMsg ok.
            End Using

    煩請指點提示
    Thanks.
    2008年3月3日 上午 09:41

解答

  • VBNET 下的 Decimal / Date 變數記憶體都已變更,需變更讀取方式。

     

    VB6 的 Date 是符合 IEEE 784 中 8 bytes 的浮點數,而 VBNET 則是改用 Ticks ,相關討論可搜尋 Ticks Variant Date

     

    所以在 VBNET 內讀取 VB6 的 Date 變數要先用 Double 讀 8 bytes ,在用 DateTime.FromOADate 。寫入則先用 DateTime.ToOADate ,再寫入 8 bytes 的 Double 。

     

    2008年3月3日 下午 12:15
    版主

所有回覆