如何在C#中的字节数组中查找字节模式?

如何在C#中的字节数组中查找字节模式?,c#,arrays,search,byte,C#,Arrays,Search,Byte,我正在从事一个项目,在这个项目中,我从一个文件中读取数据,我需要处理其中的一些数据 数据是二进制的,其中包含一些ASCII编码的文本。 如果有必要,数据也会以大端保存 我想完成的是找到一个包含此数据的模式,并操作该模式的部分内容 示例:(09 49 6E 76 65 6E 74 6F 72 79 0A 00 00 02 01 00) 这表示库存中有多少字母的数字9,后跟ASCII“库存”,不带引号。“0A”表示ASCII文本的结尾,后面是00 02,表示库存量为“2”。“01 00”表示整个库存

我正在从事一个项目,在这个项目中,我从一个文件中读取数据,我需要处理其中的一些数据

数据是二进制的,其中包含一些ASCII编码的文本。 如果有必要,数据也会以大端保存

我想完成的是找到一个包含此数据的模式,并操作该模式的部分内容

示例:(09 49 6E 76 65 6E 74 6F 72 79 0A 00 00 02 01 00)

这表示库存中有多少字母的数字9,后跟ASCII“库存”,不带引号。“0A”表示ASCII文本的结尾,后面是00 02,表示库存量为“2”。“01 00”表示整个库存区域的结束

例二:(04536C6F7400)

这表示槽中有多少个字母的数字4,后跟不带引号的ASCII“槽”。“00”是ASCII文本和插槽号“02”之间的空格,后跟区域“00”的结尾

我需要在文件中找到这些模式和其他几个模式。 然后我需要修改部分模式并写入磁盘

示例修改:(04 53 6C 6F 74 00 02 00)“从上方”更改为(04 53 6C 6F 74 00 07 00)将“插槽号”更改为“07”

另一个警告是,虽然我需要在不同大小、长度和包含数据的文件中搜索几个模式,但这些模式可能有多个部分包含不同的数据,需要作为一个整体单独修改

澄清:(库存、插槽、id、计数)-将被视为一个人的信息

记录的每个人都可以有多个副本(库存、插槽、id、计数)

我希望向用户显示此信息,并为他们提供修改组中每个元素的选项

我不是一个好的程序员,我想学习,如果你有例子,我很感激,如果你有建议,请给它。如果你能哑下来,这是更好的,谢谢。 我有一项工作正在进行中,但我现在卡住了。如果你想看看我有什么,请告诉我

我所拥有的内容总结:将文件读入字节[],然后将整个数组显示到控制台。仅此而已。通过一点格式设置和一些调试信息来定位读入数组的块

这是我在pastebin上的代码链接

我意识到,我并没有得到所有出现的(库存、插槽、id、计数),我也需要修复它们

编辑:示例(09 49 6E 76 65 6E 74 6F 72 79 0A 00 00 02 01 00)这是我正在读取的文件中的一个固定长度的二进制数据块。如上所述,09表示字符串的长度。字符串后面是(0A 00 00 00 02 01 00),它的重要部分是(02) 这是因为这是该二进制数据片中唯一更改的字节。“02”表示“2”,表示该特定人员记录有2个实例(Slot、id、Count)

(File)
    (09 Inventory 0A 00 00 00 02 01 00) // Start of person 1's record with 2 instances.
        (Slot)
        (id)
        (Count)
        (Slot)
        (id)
        (Count)
    (Rotation)  // End of person 1's record

    (09 Inventory 0A 00 00 00 04 01 00) // Start of person 2's record with 4 instances.
        (Slot)
        (id)
        (Count)
        (Slot)
        (id)
        (Count)
        (Slot)
        (id)
        (Count)
        (Slot)
        (id)
        (Count)
    (Rotation)  // End of person 2's record
(File End)
我的想法是,我想编辑“id”或通过添加到库存中来增加插槽的数量,并添加(插槽、id、计数)的更多实例

“id”-包含项目id

“插槽”-包含库存插槽编号

“计数”-包含该插槽中的项目数量。
编辑说明:如果我不清楚,请告诉我,再次感谢。

你说你不是一个好的程序员。然后我会提出一些基本建议

首先,对于任何问题,将其分解。尝试将其分解为您可以解决或认为更容易解决的简单子问题。您说您希望检查文件中的模式,然后可能修改一些数据并将其写回。作为第一步,我想说,这些是您需要解决的主要子问题,以便找到一个完整的解决方案

  • 读文件
  • 在二进制数据中搜索模式
  • 修改
  • 写出修改后的数据
您主要关注的是“搜索模式”部分,因此我将进一步讨论这一部分。所有其他部分也可能很棘手,但您可以自己解决它们,或者寻找有关stackoverflow的提示,或者在其他地方寻找其他人如何解决它们的提示

好的,现在,关于“搜索模式”。在我阅读你的描述时

在我看来,字节数组中的第一个字节是文本长度。在C#代码中,显示模式的数据数组可以这样显式声明:

byte[] data = new byte[] { 9, 0x49, 0x6E, 0x76, 0x65, 0x6E, 0x74,
               0x6F, 0x72, 0x79, 0x0A, 0, 0, 0, 2, 1, 0 } ;
当然,您不会显式声明数组。您将通过文件读取操作创建或填充数组。此时,文件读取仍然是一个开放的问题,但这没关系-您可以单独解决它。而且,效果是一样的-当您成功读取文件时,您将拥有一个与数组类似的字节数组这是上面明确声明的

好的,现在你如何操作这些数据呢?第一个字节是字符串数据的长度。接下来的N个字节是字符串数据。然后你有一些其他的东西

您没有确切描述要进行哪些“修改”,但根据您提供的信息,应该很容易浏览数据

如果您想在数组中获取数据的“切片”,可以这样做

int length = (int) data[0];
byte[] s = new byte[length];
Array.Copy(data, 0, s, 0, length);
// now, s contains N bytes, representing the string
接下来,您可能要做的是从已切掉的字节中获取一个实际字符串。要做到这一点,请使用:

我不理解字符串数据后面的数据模式。在某些情况下,它是
00
,在某些情况下,它是
0A

但也许你知道这种模式。按照同样的方法,你可以遍历一条“记录”的所有数据。当你到达记录的末尾,然后重新开始并处理下一条记录。进入下一条“记录”的关键是知道从文件中读取的数据中取出的数据片有多大


这让我们回到了“读取文件”子问题。一种获得正确da量的方法
String word = System.Text.Encoding.UTF8.GetString(s);
byte[] size = new byte[1];
var fileStream = File.OpenRead(path);
int offset = 0;
int n;
n = fileStream.Read(size, offset, 1);
// size[0] now contains the byte of data indicating the number of bytes to follow
int length = (int)size[0];
byte[] stringData = new byte[length];
n = fileStream.Read(stringData, offset, length);
String word = System.Text.Encoding.UTF8.GetString(stringData);