如何在C#中的字节数组中查找字节模式?
我正在从事一个项目,在这个项目中,我从一个文件中读取数据,我需要处理其中的一些数据 数据是二进制的,其中包含一些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)如何在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”表示整个库存
(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
“插槽”-包含库存插槽编号
“计数”-包含该插槽中的项目数量。
编辑说明:如果我不清楚,请告诉我,再次感谢。你说你不是一个好的程序员。然后我会提出一些基本建议 首先,对于任何问题,将其分解。尝试将其分解为您可以解决或认为更容易解决的简单子问题。您说您希望检查文件中的模式,然后可能修改一些数据并将其写回。作为第一步,我想说,这些是您需要解决的主要子问题,以便找到一个完整的解决方案
- 读文件
- 在二进制数据中搜索模式
- 修改
- 写出修改后的数据
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);