将数据追加到字节数组

本文关键字:数组 到字节 追加 数据 | 更新日期: 2023-09-27 17:56:08

目前,我正在从二进制文件(File.ReadAllBytes)中读取数据,将此字节数组转换为字符串并将数据附加到此字符串上。最后,我将字符串转换回字节数组并将数据写回新文件。

是的 - 这种方法相当愚蠢,我一直很好奇是否有某种方法可以将这些数据附加到字节数组的末尾(以字节的形式)。

String s = @"C:'File.exe";
Byte b[] = File.ReadAllBytes(s);
String NewString = ConvertToString(b[]);
NewString = NewString + "Some Data";
b[] = ConvertToByteArray(NewString);
File.WriteAllBytes(b[]);

ConvertToByteArray 和 ConvertToString 表示将字符串> Byte> 字符串转换的函数。

我想做什么:

b[] = file.readallbytes(s)
b = b + "new Data"
file.writeallbytes(b[])

非常感谢您对此事的任何见解。

将数据追加到字节数组

你应该习惯于使用 Streams - 在这种情况下,你可以使用MemoryStream来实现完全相同的事情,而无需所有这些讨厌的数组。

byte[] bytes = File.ReadAllBytes(inFilePath);
using (MemoryStream ms = new MemoryStream())
{
    // You could also just use StreamWriter to do "writer.Write(bytes)"
    ms.Write(bytes, 0, bytes.Length);
    using (StreamWriter writer = new StreamWriter(ms))
    {
        writer.Write("Some Data");
    }
    File.WriteAllBytes(outFilePath, ms.ToArray());
}

诚然,这看起来比你的代码更复杂,但在幕后它所做的更有效。

当然,如果您只是写入另一个文件(甚至是同一个文件),您可以简单地直接写入该文件,完全跳过对byte数组或MemoryStream的需求 - 这就是流的美妙之处。

使用List<Byte>,使用 AddRange 将初始ReadAllBytes中的每个字节相加,然后添加下一组字节。最后,使用 CopyTo 将所有字节复制到数组(大小为 List.Length )。

使用 FileStream ,查找到文件的末尾,然后编写您需要的内容:

using (var fs = new FileStream(s, FileMode.Open, FileAccess.ReadWrite))
{
    fs.Seek(SeekOrigin.End);
    fs.Write(data, 0, data.Length);
}

如果您确实需要读取整个文件,则只需使用 Array.Resize 使缓冲区更大,然后复制要追加的部分。

var data = File.ReadAllBytes(s);
Array.Resize(ref data, data.Length + toAppend.Length);
Array.Copy(toAppend, 0, data, data.Length - toAppend.Length, toAppend.Length);
File.WriteAllBytes(s, data);

对此没有"速记",对不起。


如果这样做的全部目的是附加一个字符串,只需使用 File.AppendAllText

如果你只想在文件中附加一些东西,那么你应该使用FileStream和StreamWriter:

        using (var f = File.Open(@"C:'File.exe", FileMode.Append))
        using (var w = new StreamWriter(f))
            w.Write("new Data");

或类似的东西。

如果您只想附加一些字节:

        using (var f = File.Open(@"C:'File.exe", FileMode.Append))
        {
            byte[] buf = new byte[] { 69, 65, 66, 67 };
            f.Write(buf, 0, buf.Length);
        }

创建一个大小为两个单独数组之和的新数组,然后将数组复制到其中。