Список <byte>и копирование байтовых массивов? - PullRequest
1 голос
/ 24 марта 2012

Итак, я работаю с форматом файла.Формат файла содержит куски данных ... Итак, у меня есть массив 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), потому что мне может понадобиться добавить дополнительные данные в существующий блок).

Проблема этого подхода заключается в том, что я «удваиваю» массив, который потребляет больше памяти.Плюс процесс копирования данных может немного замедлить работу моего приложения, тем более что файл обычно содержит много данных.

Есть ли лучший подход к этому?

Одна вещь, которая могла быЯ легко решил, что это исправление списка, и вместо того, чтобы резервировать / регистрировать массив, я могу просто получить доступ к массиву напрямую через указатель.Есть ли способ сделать это?

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 24 марта 2012

Вы должны обратиться к функции байтового массива, называемой "CopyTo"

Например, вот какой-то старый код из обработчика сетевых пакетов, который я написал несколько лет назад:

Public Sub SendData(ByVal Data() As Byte)
    Try
        Dim Length As Integer = Data.Length
        Dim D() As Byte = BitConverter.GetBytes(Data.Length)
        ReDim Preserve D(D.Length + Data.Length - 1)
        Data.CopyTo(D, 4)
        client.BeginSend(D, 0, D.Length, 0, AddressOf sockSendEnd, client)
    Catch
        RaiseEvent onError(Err.Description)
    End Try
End Sub
0 голосов
/ 24 марта 2012

Если цель состоит в том, чтобы вставить определенную коллекцию байтов перед остальными записями в вашем List<List<byte>>, тогда вы можете использовать перегрузку:

DataChunks.Insert(0, prefix);

, где 0 представляет индекс элемента в коллекции для вставки до, а prefix - значение для вставки.

Затем, чтобы получить результирующий поток байтов:

foreach(byte b in DataChunks.SelectMany(c => c))
    Console.WriteLine(b); // replace with the method you use to write the `List of Lists of Bytes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...