vb.net有效地在字节数组中查找字节序列

时间:2017-07-01 10:07:35

标签: vb.net

所以我正在创建一个软件,简而言之,它有一个原始字节序列列表和那些需要更改这些字节的新序列,有点像文本形式“原始位置(目前与序列无关)在不同的地方)$ 56,69,71,73,75,77:56,69,71,80,50,54“

我已经有了可以正常工作的代码,但是这些序列中最多有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)

1 个答案:

答案 0 :(得分:1)

让我们看一下代码中的内部while循环,有些东西可以优化:

无需一直检查总长度

local function b2n(x)
    if x==false then return 0 end
    if x==true  then return 1 end
    return x
end

debug.setmetatable(false,{
    __mul=function(x,y) return b2n(x)*b2n(y) end
})

print(true*5 > 10.3*false)

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

这个while循环是一个真正的瓶颈,因为你总是检查databox2bytes的全长,你应该在它们不匹配时退出while循环

        Dim samebytecounter As Integer = 1

这看起来很好,但是您已经将数据拆分到while循环的顶部,因此,无需再创建另一个执行相同操作的数组

        While samebytecounter  < databox2bytes.Length AndAlso originalbytes(y + samebytecounter ) = databox2bytes(samebytecounter )
            samebytecounter = samebytecounter + 1
        End 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

这可能会节省大量时间。

对于其余部分,您的代码似乎是以这样一种方式创建的:如果它存在一个月左右,没有人会真正理解它,我会说,包括你自己