private void GetData(out MemoryTributary dataStream) { UInt32 stElemSize = stElemAddr.Size(); UInt32 NeedDataBufferSize = 0; NeedDataBufferSize += stFileHeader.Size(); // заголовок блока и данные блока - адреса элементов с учетом минимальной страницы 512 байт NeedDataBufferSize += stBlockHeader.Size() + (UInt32)Math.Max(stElemSize * Elems.Count, V8_DEFAULT_PAGE_SIZE); foreach (CV8Elem elem in Elems) { // заголовок блока и данные блока - заголовок элемента NeedDataBufferSize += stBlockHeader.Size() + elem.HeaderSize; // заголовок блока и данные блока - данные элемента с учетом минимальной страницы 512 байт NeedDataBufferSize += stBlockHeader.Size() + (UInt32)Math.Max(elem.DataSize, V8_DEFAULT_PAGE_SIZE); } // Создаем и заполняем данные по адресам элементов byte[] pTempElemsAddrs = new byte[Elems.Count * stElemSize]; UInt32 cur_block_addr = stFileHeader.Size() + stBlockHeader.Size(); if (stElemSize * Elems.Count < V8_DEFAULT_PAGE_SIZE) cur_block_addr += V8_DEFAULT_PAGE_SIZE; // 512 - стандартный размер страницы 0x200 else cur_block_addr += stElemSize * (UInt32)Elems.Count; foreach (CV8Elem elem in Elems) { UInt32 elNum = (UInt32)Elems.IndexOf(elem); stElemAddr tmpAdrr = new stElemAddr(); tmpAdrr.elem_header_addr = cur_block_addr; cur_block_addr += stBlockHeader.Size() + elem.HeaderSize; tmpAdrr.elem_data_addr = cur_block_addr; cur_block_addr += stBlockHeader.Size(); if (elem.DataSize > V8_DEFAULT_PAGE_SIZE) cur_block_addr += elem.DataSize; else cur_block_addr += V8_DEFAULT_PAGE_SIZE; tmpAdrr.fffffff = 0x7fffffff; byte[] tmpAddrBytes = tmpAdrr.ToBytes(); Array.Copy(tmpAddrBytes, 0, pTempElemsAddrs, elNum * stElemSize, stElemSize); } dataStream = new MemoryTributary(); dataStream.SetLength(NeedDataBufferSize); BinaryWriter dataStreamBin = new BinaryWriter(dataStream); //DataBuffer = new byte[NeedDataBufferSize]; UInt32 cur_pos = 0; // записываем заголовок byte[] fileHeader = FileHeader.ToBytes(); dataStreamBin.Write(fileHeader); //Array.Copy(fileHeader, 0, DataBuffer, cur_pos, fileHeader.Length); cur_pos += stFileHeader.Size(); // записываем адреса элементов SaveBlockDataToBuffer(ref dataStreamBin, ref cur_pos, pTempElemsAddrs); // записываем элементы (заголовок и данные) foreach (CV8Elem elem in Elems) { SaveBlockDataToBuffer(ref dataStreamBin, ref cur_pos, elem.pHeader, elem.HeaderSize); SaveBlockDataToBuffer(ref dataStreamBin, ref cur_pos, elem.pData); } pTempElemsAddrs = null; }