예제 #1
0
        /// <summary>
        /// 生成区域头部
        /// <paramref name="offset">偏移位置</paramref>
        /// </summary>
        private byte[]  GeneratorDataRegionHeader(out int totallenght)
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();
            //文件头部结构:Pre DataRegion(8) + Next DataRegion(8) + Datatime(8)+tagcount(4)+ tagid sum(8) +file duration(4)+ block duration(4)+Time tick duration(4)+ { len + [tag id]}+ [data blockpoint(8)]
            int blockcount = FileDuration * 60 / BlockDuration;
            int len        = GetDataRegionHeaderLength() + 4 + mTagIdMemoryCach.Position + mTagCount * (blockcount * 8);

            totallenght = len;

            using (System.IO.MemoryStream mHeadMemory = new System.IO.MemoryStream())
            {
                mHeadMemory.Position = 0;
                mHeadMemory.Write(BitConverter.GetBytes((long)mPreDataRegion));      //更新Pre DataRegion 指针
                mHeadMemory.Write(BitConverter.GetBytes((long)0));                   //更新Next DataRegion 指针
                mHeadMemory.Write(MemoryHelper.GetBytes(mCurrentTime));              //写入时间
                mHeadMemory.Write(BitConverter.GetBytes(mTagCount));                 //写入变量个数

                mHeadMemory.Write(BitConverter.GetBytes(mTagIdSum));                 //写入Id 校验和

                mHeadMemory.Write(BitConverter.GetBytes(FileDuration));              //写入文件持续时间
                mHeadMemory.Write(BitConverter.GetBytes(BlockDuration));             //写入数据块持续时间
                mHeadMemory.Write(BitConverter.GetBytes(HisEnginer.MemoryTimeTick)); //写入时间间隔

                //写入变量编号列表
                mHeadMemory.Write(BitConverter.GetBytes(mTagIdMemoryCach.Position));      // mHeadMemory.Write(mTagIdMemoryCach.Position);//写入压缩后的数组的长度
                mHeadMemory.Write(mTagIdMemoryCach.Buffer, 0, mTagIdMemoryCach.Position); //写入压缩数据

                mBlockPointOffset = mHeadMemory.Position;

                sw.Stop();

                LoggerService.Service.Info("SeriseFileItem" + Id, "GeneratorDataRegionHeader " + sw.ElapsedMilliseconds);

                return(mHeadMemory.ToArray());
            }
        }
예제 #2
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="value"></param>
 /// <param name="start"></param>
 public override DataFileSeriserbase Write(DateTime value, long start)
 {
     mStream.Position = start;
     mStream.Write(MemoryHelper.GetBytes(value), 0, 8);
     return(this);
 }