如何将字节值拆分为多个较小的字节值?

时间:2019-07-14 16:56:25

标签: arrays vb.net split byte

我正在学习在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)

提前谢谢!

2 个答案:

答案 0 :(得分:2)

您的代码有一些问题:

  1. 您拥有的两个数组(SortieSortie2)未初始化(它们的长度为零)。因此,当您尝试复制到它们时,Copy方法将失败,因为“数组不够长”。要设置数组的长度,我们使用Dim someVariable(length - 1) As SomeType。例如,Dim arr(9) As Byte是一个字节数组,长度为10。

  2. Bytes_Executable.Length / 2

    这不能处理字节数为奇数的情况。

  3. 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)