Exemplo n.º 1
0
            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;
            }