繁体   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