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

3

我正在学习VB.NET编程,并尝试操作一个可执行文件。

我的项目要求我一个字节变量(由File.ReadAllBytes获取)分成两部分,然后才能将它们“粘”在代码的另一部分中。

我考虑将我的字节数组转换为字符串,然后使用.Split进行拆分,最后再将其转换为字节数组,但是我的可执行文件不再起作用:转换为字符串会杀死可执行文件中的某些字符,使其过时。

我发现了这篇文章:Split a byte array at a delimiter

..但问题在于他使用C#进行操作,而我难以将其代码转换为VB.NET。

总之,以下是我的程序步骤:

  • 通过File.ReadAllBytes读取所有字节
  • 定期拆分该字节数组。分隔符不是字符串,而是数组的一半。
  • 对渠道进行分组并执行

我尝试将可执行文件拆分为两个字节变量,但我被卡住了:

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)

实际上,我遇到了这个错误:目标表不够长。请检查destIndex和长度,以及数组下限。

这个错误指向以下代码行:

Array.Copy(Bytes_Executable, Separator, Sortie2, 0, Bytes_Executable.Length)

非常感谢您提前的支持!

2个回答

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()来解决第二个问题。Math.Ceiling会在传递2.5时返回3,例如。


感谢您的解释。对于第一部分,我不知道在使用数组之前必须定义其长度。我以为这个长度是灵活的,没有固定的声明。无论如何,非常感谢您,您讲解得很好! :) - Corentin Mar
2
不客气!让我澄清一下...你不 总是 需要设置数组的长度。例如,如果你将为它分配另一个值(例如,Dim arr As Integer() = someListOfInteger.ToArray()= SomeFunctionThatReturnsAnArray()),则不需要设置长度。然而,如果你要填充数组(Array.Copy()是一种填充数组的方式),则必须设置长度。祝你好运 :) - 41686d6564 stands w. Palestine

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)

非常感谢。事实上,我在这个项目中犯了很多错误,特别是关于两个变量Sortie的声明。现在我理解得更好了。最后一个参数的错误是我的失误;事实上,我对文档的理解有误。 - Corentin Mar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接