我正在学习在VB.NET中编程,并且试图操纵可执行文件
我的项目要求我剪切一个字节变量(感谢File.ReadAllytes
),分成两部分,以便能够“粘贴”在代码的另一部分。
我考虑过将字节数组转换为字符串,然后拆分(使用.Split),最后将其转换为字节数组,但是我的可执行文件不再起作用:转换为字符串会杀死可执行文件中的某些字符,使其过时。
我发现了这篇文章:Split a byte array at a delimiter
..但是问题在于他使用C#工作,我觉得将其代码转换为vb.net确实很困难。
总而言之,这是我程序的步骤:
File.ReadAllytes
我已经尝试过将我的可执行文件拆分为两个字节的变量,但是我阻止了:
Bytes_Executable = IO.File.ReadAllBytes(File1)
Dim Separator As Integer = Bytes_Executable.Length / 2
MsgBox(Separator)
Dim Sortie = {}
Dim Sortie2 = {}
Array.Copy(Bytes_Executable, 0, Sortie, 0, Separator)
Array.Copy(Bytes_Executable, Separator, Sortie2, 0, Bytes_Executable.Length)
确实,我遇到了以下错误:The destination table is not long enough. Check destIndex and the length, as well as the lower limits of the array.
此错误指向此行:
Array.Copy(Bytes_Executable, Separator, Sortie2, 0, Bytes_Executable.Length)
提前谢谢!
答案 0 :(得分:2)
您的代码有一些问题:
您拥有的两个数组(Sortie
和Sortie2
)未初始化(它们的长度为零)。因此,当您尝试复制到它们时,Copy
方法将失败,因为“数组不够长”。要设置数组的长度,我们使用Dim someVariable(length - 1) As SomeType
。例如,Dim arr(9) As Byte
是一个字节数组,长度为10。
Bytes_Executable.Length / 2
:
这不能处理字节数为奇数的情况。
Array.Copy(Bytes_Executable, Separator, Sortie2, 0, Bytes_Executable.Length)
:
在这里,您使用的是Bytes_Executable
的全长来填充第二个数组。因此,即使您正确设置了数组的长度(第1点),这仍然会失败,因为第二个数组的长度仅为原始数组的一半。
您可以使用以下内容:
Dim filePath = "The\Path\to\your\file.exe"
Dim exeBytes = IO.File.ReadAllBytes(filePath)
Dim len1 As Integer = CInt(Math.Ceiling(exeBytes.Length / 2))
Dim len2 As Integer = exeBytes.Length - len1
Dim firstHalf(len1 - 1) As Byte
Dim secondHalf(len2 - 1) As Byte
Array.Copy(exeBytes, 0, firstHalf, 0, len1)
Array.Copy(exeBytes, len1, secondHalf, 0, len2)
如您所见,我使用Math.Ceiling()
来解决第二个问题。例如,当您通过2.5时,Math.Ceiling
将返回3。
答案 1 :(得分:1)
使用整数除法(\
)计算第一部分的大小
Dim Separator As Integer = Bytes_Executable.Length \ 2
在调用Array.Copy
之前,必须以正确的长度创建目标数组。
Dim Sortie(Separator - 1) As Byte
Dim Sortie2(Bytes_Executable.Length - Separator - 1) As Byte
请注意,由于在VB中,我们指定数组索引的上限而不是数组的长度,因此必须减去1。
您必须指定要复制的长度作为最后一个参数(即剩余长度)
Array.Copy(Bytes_Executable, Separator, Sortie2, 0, Bytes_Executable.Length - Separator)