【问题标题】:Append Data to Byte Array将数据附加到字节数组
【发布时间】:2012-09-26 08:48:08
【问题描述】:

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

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

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 表示将字符串 > 字节 > 字符串转换的函数。

我想做的事:

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

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

【问题讨论】:

    标签: c# string bytearray


    【解决方案1】:

    您应该习惯使用 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 的需求 - 这就是流的美妙之处.

    【讨论】:

    • 这完全符合我的设想。非常感谢您的宝贵时间。 (你们所有人)。
    【解决方案2】:

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

    【讨论】:

    • 我只是好奇,你认为你能给我一个如何加入以下的简单例子吗?字节[] bData; string sData = "测试数据"; bData = bData + Convert.ToByte(sData);我在 list 上做了一些阅读,但我仍然有些困惑。
    【解决方案3】:

    使用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来读取二进制文件?
    • @Evan:不,抱歉,请参阅我的编辑。那是假设您实际上不需要阅读整个文件;如果你这样做,请使用Array.Resize
    【解决方案4】:

    如果你只是想在文件中添加一些东西,那么你应该使用 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);
            }
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 我认为“总和”是指“串联”之类的,对吧?
      • @Mehrdad a1.Lenght + a2.Lenght 就是这样。我的英语不好,难过,但很真实:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2011-10-15
      • 1970-01-01
      • 2023-03-08
      • 2018-05-03
      • 1970-01-01
      相关资源
      最近更新 更多