Добавить данные в байтовый массив - PullRequest
9 голосов
/ 11 мая 2011

В настоящее время я читаю данные из двоичного файла (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[])

Большое спасибо за понимание этого вопроса.

Ответы [ 5 ]

16 голосов
/ 11 мая 2011

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

5 голосов
/ 11 мая 2011

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

5 голосов
/ 11 мая 2011

Используйте 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!

2 голосов
/ 11 мая 2011

Если вы просто хотите добавить что-то в файл, вам следует использовать 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);
        }
0 голосов
/ 11 мая 2011

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

...