Добавить данные в массив байтов

#c# #string #bytearray

#c# #строка #массивы

Вопрос:

В настоящее время я считываю данные из двоичного файла (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 представляют функции, которые преобразуют строку > Байт > строка.

Что я хотел бы сделать:

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

Большое вам спасибо за любую информацию по этому вопросу.

Ответ №1:

Вы должны привыкнуть к работе с потоками — в этом случае вы могли бы использовать 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 полностью — в этом прелесть потоков.

Комментарии:

1. Это сработало именно так, как я предполагал. Большое вам спасибо за ваше время. (Все вы).

Ответ №2:

Используйте a List<Byte> , добавьте каждый байт из первоначального ReadAllBytes использования AddRange , а затем добавьте следующий набор байтов. Наконец, используйте CopyTo для копирования всех байтов в массив (соответствующего размера List.Length ).

Комментарии:

1. Мне было просто любопытно, как вы думаете, вы могли бы привести мне краткий пример того, как объединить следующее? байт[] bData; строка sData = «тестовые данные»; bData = bData Преобразовать. ToByte (sData); Я немного почитал список<байт>, но я все еще в некотором замешательстве.

Ответ №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 !

Комментарии:

1. вы предлагаете мне использовать filestream также для чтения двоичного файла?

2. @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:

Создайте новый массив размером, равным сумме двух отдельных массивов, затем скопируйте в него свои массивы.

Комментарии:

1. Я думаю, что под «суммой» вы подразумеваете «конкатенацию» или что-то в этомроде, верно?

2. @Mehrdad a1. Длина a2.То есть длина. Мой английский не очень хорош, грустный, но верный 🙂