簡體   English   中英

如何更快地操作二進制文件?

[英]How to operate with binary files faster?

我正在嘗試做的事情:

  1. 打開兩個二進制文件,每個 64 MB
  2. 取每個文件的每個字節的前半部分,並將它們組合成與后半部分相同的 1 個字節,例如:第一個文件中的第一個字節是 0x51,第二個文件中是 0xA2,所以我需要在第三個文件中寫入兩個字節,即 0x5A和 0x12,整個字節相同,因此第三個文件的最終長度為 128 MB。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles 
       Button1.Click
      Try                                                                             
    ' choosing first file
        OpenFileDialog1.FileName = "First file"
        OpenFileDialog1.Title = "Choose the Address.bin file"
        OpenFileDialog1.Filter = "bin files (*.bin)|*.bin|All files 
         (*.*)|*.*"
        If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK 
         Then
            Label1.Text = 
         System.IO.Path.GetFullPath(OpenFileDialog1.FileName)

        Else
            Exit Sub
        End If
    Catch ex As Exception
    End Try
    Try                                                                               ' choosing first file
        OpenFileDialog1.FileName = "Second FIle"
        OpenFileDialog1.Title = "Choose the Flash.bin file"
        OpenFileDialog1.Filter = "bin files (*.bin)|*.bin|All files (*.*)|*.*"
        If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            Label2.Text = System.IO.Path.GetFullPath(OpenFileDialog1.FileName)

        Else
            Exit Sub
        End If
    Catch ex As Exception
    End Try
    Dim firstFileByte(1) As Byte
    Dim SecondFileByte(1) As Byte
    Dim Result As String
    Dim Result2 As String
    Dim Final(1) As Byte

    For i = 0 To FileLen(Label1.Text) - 1



        Using FirstFile As New FileStream(Label1.Text, FileMode.Open) 'save

            'FIRST DIGIT********************************************************************************************
            FirstFile.Seek(i, SeekOrigin.Begin)
            FirstFile.Read(firstFileByte, 0, 1)

            'TextBox1.Text = final(0).ToString("X")
            Using SecFile As New FileStream(Label2.Text, FileMode.Open) 'save
                SecFile.Seek(i, SeekOrigin.Begin)
                SecFile.Read(SecondFileByte, 0, 1)
            End Using
            Result = firstFileByte(0).ToString("X2").Substring(0, 1) & SecondFileByte(0).ToString("X2").Substring(0, 1)   ' comobining frist half of the first file and second file 
            Result2 = firstFileByte(0).ToString("X2").Substring(1, 1) & SecondFileByte(0).ToString("X2").Substring(1, 1) ' comobining second half of the first file and second file  

        End Using
        Using vFs As New FileStream(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\Result.bin", FileMode.Append) '  save
            TextBox1.Text = Result2
            'Dim FileLenVar As UInt32 = FileLen(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\Result.bin") - 1

            Final(0) = Convert.ToByte(Result, 16)    'converting result to the byte
            Final(1) = Convert.ToByte(Result2, 16)

            vFs.Write(Final, 0, 1)

            vFs.Write(Final, 1, 1)

        End Using
    Next
End Sub

它可以工作,但需要很長時間:它在 1 分鍾內寫入 1 MB。 我該如何優化它?

這些文件足夠小,可以加載到 RAM 中進行處理。 在 RAM 中處理數據可以最大限度地減少所需的磁盤 I/O,后者通常是程序中最慢的部分,尤其是當它以非常小的片段(如單個字節)完成時。 正如Ben Voigt 所指出的,字符串操作比數字操作要慢一些。

以下是可以做什么的簡單演示:

Imports System.IO

Module Module1
    Dim f1 As String = "C:\temp\A.bin"
    Dim f2 As String = "C:\temp\B.bin"
    Dim outFile As String = "C:\temp\C.bin"

    Sub CombineFiles()
        Dim a1 = File.ReadAllBytes(f1)
        Dim a2 = File.ReadAllBytes(f2)
        Dim c(a1.Length + a2.Length - 1) As Byte ' c for combined

        Dim highBits As Byte = &HF0
        Dim lowBits As Byte = &HF

        For i = 0 To c.Length - 1 Step 2
            c(i) = a1(i \ 2) And highBits Or a2(i \ 2) >> 4
            c(i + 1) = a1(i \ 2) << 4 Or a2(i \ 2) And lowBits
        Next

        File.WriteAllBytes(outFile, c)

    End Sub

    Sub CreateTestFiles()
        'TODO: be more creative with the generated data.

        Dim nBytes = 64
        Dim a(nBytes - 1) As Byte

        For i = 0 To nBytes - 1
            a(i) = &H12
        Next

        File.WriteAllBytes(f1, a)

        For i = 0 To nBytes - 1
            a(i) = &HAB
        Next

        File.WriteAllBytes(f2, a)

    End Sub

    Sub Main()
        'CreateTestFiles()
        CombineFiles()

    End Sub

End Module

當然,您會檢查輸入文件的長度是否相等,並檢查是否存在任何其他可能的問題;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM