如何从C#中的字节数组中删除和添加字节

我有一个配置文件(.cfg),我用它来创建一个命令行应用程序来将用户添加到SFTP服务器应用程序。

cfg文件需要为cfg文件中的每个条目提供一定数量的保留字节。 我目前只是通过创建一个字节数组并将其转换为字符串,然后将其复制到文件,将新用户附加到文件的末尾,但我遇到了麻烦。 配置文件在文件末尾需要4个字节。

我需要完成的过程是从文件中删除这些尾随字节,附加新用户,然后将字节追加到末尾。

所以,现在你的问题背后有一些背景。

这是一个问题:

如何从字节数组中删除和添加字节?

这是我到目前为止的代码,它从一个文件读取用户并将其附加到另一个文件。

static void Main(string[] args) { System.Text.ASCIIEncoding code = new System.Text.ASCIIEncoding(); //Encoding in ascii to pick up mad characters StreamReader reader = new StreamReader("one_user.cfg", code, false, 1072); string input = ""; input = reader.ReadToEnd(); //convert input string to bytes byte[] byteArray = Encoding.ASCII.GetBytes(input); MemoryStream stream = new MemoryStream(byteArray); //Convert Stream to string StreamReader byteReader = new StreamReader(stream); String output = byteReader.ReadToEnd(); int len = System.Text.Encoding.ASCII.GetByteCount(output); using (StreamWriter writer = new StreamWriter("freeFTPdservice.cfg", true, Encoding.ASCII, 5504)) { writer.Write(output, true); writer.Close(); } Console.WriteLine("Appended: " + len); Console.ReadLine(); reader.Close(); byteReader.Close(); } 

为了试图说明这一点,这里是一个“图表”。

1)添加第一个用户

文件(附加文本)结尾的字节(零)

2)添加第二个用户

结尾的文件(附加文本)(附加文本)字节(零)

等等。

你没有。 您可以复制到所需大小的新数组。 或者您可以使用List ,然后从中创建一个数组。

但是,在您的情况下,我建议您自己查看文件流…它们允许您读取和写入单个字节或字节数组,还可以:

  • 寻求

它允许你移动到文件中的任意位置……所以,对于你描述的用例,你会

  • 打开文件(用于读/写访问)
  • 移到文件的末尾
  • 向后移动四个字节(你知道它们是哪些?如果没有,这将是存放它们的好时机)
  • 写新用户
  • 写四个字节
  • 关闭文件

像这样的东西:

 using (var fs = new FileStream(PATH, FileMode.Open, FileAccess.ReadWrite)) { fs.Seek(-4, SeekOrigin.End); fs.Write(userBytes); fs.Write(fourBytesAtEnd); } 

这也具有不必在整个文件中啜饮并将其写回的优点。

要明确回答您的问题: 如何从字节数组中删除和添加字节?

您只能通过创建一个新数组并将字节复制到其中来完成此操作。

幸运的是,使用Array.Resize()简化了这一过程:

 byte[] array = new byte[10]; Console.WriteLine(array.Length); // Prints 10 Array.Resize(ref array, 20); // Copies contents of old array to new. Console.WriteLine(array.Length); // Prints 20 

如果你需要从头开始删除字节 – 首先是Array.Copy字节而不是resize(如果你不喜欢ref则复制到新数组):

 // remove 42 bytes from beginning of the array, add size checks as needed Array.Copy(array, 42, array, 0, array.Length-42); Array.Resize(ref array, array.Length-42);