所以我正在创建一个软件,简而言之,它有一个原始字节序列列表和那些需要更改这些字节的新序列,有点像文本形式“原始位置(目前与序列无关)在不同的地方)$ 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)
答案 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
这可能会节省大量时间。
对于其余部分,您的代码似乎是以这样一种方式创建的:如果它存在一个月左右,没有人会真正理解它,我会说,包括你自己