Итак, я работаю с форматом файла.Формат файла содержит куски данных ... Итак, у меня есть массив List для «кусков».Они добавляются, когда я добавляю данные в класс с помощью функции.
Теперь, когда я сохраняю файл, мне нужно «вставить» блок в начале.Теперь я знаю, что это может не иметь смысла, но мне нужно добавить этот блок (который пуст), ДО того, как я вычислю смещения данных для типов данных в блоках.Если я этого не сделаю, смещения данных облажаются.После того, как я вставляю этот пустой блок, я создаю новый массив byte [], в который я копирую необходимые данные, и затем «перезаписываю» пустой блок, который я вставил, с обновленным байтовым массивом.
Основная причина, по которой мне нужно это сделать, заключается в том, что вставляемый мной блок данных содержит смещения других данных, поэтому мне нужно создать смещения после того, как все было добавлено.
По сути, у меня есть это (только упрощенно):
public struct SizeIndexPair {
public int Size;
public int Index;
};
public class Chunks {
private Dictionary<int, SizeIndexPair> reserved;
public List<List<byte> > DataChunks;
...
public void Reserve(int ID, int size, int index) {
SizeIndexPair sip;
sip.Size = size;
sip.Index = index;
reserved.Add(ID, sip);
List<byte> placeHolder = new List<byte>(size);
DataChunks.Insert(index, placeHolder);
}
public void Register(int ID, byte[] data) {
SizeIndexPair sip = reserved[ID];
if (sip.Size != data.Length)
throw new IndexOutOfRangeException();
for (int i = 0; i < data.Length; i++) {
DataChunks[sip.Index][i] = data[i];
}
}
};
(здесь я использую List (byte), потому что мне может понадобиться добавить дополнительные данные в существующий блок).
Проблема этого подхода заключается в том, что я «удваиваю» массив, который потребляет больше памяти.Плюс процесс копирования данных может немного замедлить работу моего приложения, тем более что файл обычно содержит много данных.
Есть ли лучший подход к этому?
Одна вещь, которая могла быЯ легко решил, что это исправление списка, и вместо того, чтобы резервировать / регистрировать массив, я могу просто получить доступ к массиву напрямую через указатель.Есть ли способ сделать это?
Спасибо за вашу помощь.