#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.То есть длина. Мой английский не очень хорош, грустный, но верный 🙂