2017-07-01 63 views
0

所以我創建了一個軟件,簡而言之,它包含一個原始字節序列和新字節的列表,這些字節需要更改爲文本形式「原來的位置(目前與序列無關,可能在不同的地方)$ 56,69,71,73,75,77:56,69,71,80,50,54」vb.net高效地查找字節數組中的字節序列

我已經擁有可以正常工作的代碼,但是可以找到和改變多達600多個這樣的序列,並且在某些情況下,它需要15分鐘+的非常長的時間,我認爲這取決於找到它們的序列需要多長時間所以我試圖找到一個更好的方式來做到這一點,因爲目前它是不可用的,由於需要多長時間。

我已經複製了整個代碼下面這個功能,希望你們中的一個好心人可以看看,並幫助=)

Dim originalbytes() As Byte

Dim fd As OpenFileDialog = New OpenFileDialog() fd.Title = "Select the file" fd.Filter = "All files (*.*)|*.*|All files (*.*)|*.*" fd.FilterIndex = 2 If fd.ShowDialog() = DialogResult.OK Then TextBox2.Text = fd.FileName originalbytes = File.ReadAllBytes(fd.FileName) End If Dim x As Integer = 0 Dim y As Integer = 0 Dim textbox1array() = TextBox1.Lines Dim changedbytes() = originalbytes Dim startvalue As Integer = 0 Dim databoxarray() As String Dim databoxarray2() As String While x < textbox1array.Length - 1 'for each change to make databoxarray = textbox1array(x).Replace(" $ ", vbCr).Replace(" : ", vbCr).Split databoxarray2 = databoxarray(1).Replace(",", vbCr).Split Dim databox2bytes() As String = databoxarray2 'copy original bytes line to databox2 lines y = 0 While y < (originalbytes.Length - databox2bytes.Length) 'repeat for all bytes in ori file - size of data to find If originalbytes(y) = databox2bytes(0) Then startvalue = y Dim z As String = 1 Dim samebytecounter As Integer = 1 While z < databox2bytes.Length 'repeat for all ori bytes If originalbytes(y + z) = databox2bytes(z) Then samebytecounter = samebytecounter + 1 End If z = z + 1 End While If samebytecounter = databox2bytes.Length Then 'same original data found, make changes Dim bytestoinsert() As String = databoxarray(2).Replace(",", vbCr).Split Dim t As Integer = 0 While t < bytestoinsert.Length changedbytes(startvalue + t) = bytestoinsert(t) t = t + 1 End While End If End If y = y + 1 End While x = x + 1 End While File.WriteAllBytes(TextBox2.Text & " modified", changedbytes)

+2

任何機會,你可以添加一些潛在的測試將要創建的休息數據和值在不同的文本框中輸入?我也沒有看到你定義'originalbytes'的地方。如果這是工作代碼,也許最好在codereview – Icepickle

+0

上發佈這個問題對不起,原始字節在另一個函數中作爲字節數組加載,不幸的是我不能共享其中一個文件,因爲它們是私有的=( –

+0

你能不能至少分享它的定義和對象類型? – Icepickle

回答

1

讓我們一起來看看該內而在你的代碼迴路,有一些東西是可以進行優化:

有沒有需要檢查的總長度所有的時間

Dim length as Integer = originalbytes.Length - databox2bytes.Length 
While y < length 


    'repeat for all bytes in ori file - size of data to find 
    If originalbytes(y) = databox2bytes(0) Then 
     startvalue = y 

z是沒有必要的,samebytecounter不完全一樣

 Dim samebytecounter As Integer = 1 

這個while循環是一個真正的瓶頸,因爲你經常檢查您的databox2bytes的全長,你倒是應該退出while循環,當他們穿上」牛逼比賽

 While samebytecounter < databox2bytes.Length AndAlso originalbytes(y + samebytecounter) = databox2bytes(samebytecounter) 
      samebytecounter = samebytecounter + 1 
     End While 

這似乎不錯,但你已經在你的while循環的頂部分裂的數據,因此,無需創建另一個數組,做一次同樣的操作

 If samebytecounter = databox2bytes.Length Then 
      'same original data found, make changes 
      Dim t As Integer = 0 
      While t < databoxarray2.Length 
       changedbytes(startvalue + t) = databoxarray2(t) 
       t = t + 1 
      End While 
     End If 
    End If 
    y = y + 1 
End While 

對於剩下的我會同意,您所創建的算法的效率非常低,理論上你的代碼可能已被改寫像如:(並沒有真正測試該代碼)

Dim text = System.Text.Encoding.UTF8.GetString(originalbytes, 0, originalbytes.Length) 
dim findText = System.Text.Encoding.UTF8.GetString(stringToFind, 0, stringToFind.Length) 
dim replaceWith = System.Text.Encoding.UTF8.GetString(stringToSet, 0, stringToSet.Length) 

text = text.Replace(findText, replaceWith) 

dim outbytes = System.Text.Encoding.UTF8.GetBytes(text) 

這很可能是節省大量時間。

爲了您的代碼似乎以這樣的方式,沒有人會真正理解它,如果它的周圍鋪設了一個月左右的時間,我會說,包括自己在內

+1

非常好(必要)代碼審查+1 – jonathana

+0

非常感謝你,這給了我一些很棒的想法,並強調了一些與原始代碼有關的問題,對於混亂的代碼抱歉不是真的意思讓別人看到並理解我第一次做到這一點= S –

+0

@TakeyaSaito歡迎您,如果它幫助你,你可以[標記爲答案](https:// stackove rumble.com/help/someone-answers) – Icepickle

相關問題