예제 #1
0
        private static void ProcessTransferBuffer()
        {
            const string oldTransferBin = "D:\\EWSTest\\OldTransfer.bin";
            const string oldTransferTxt = "D:\\EWSTest\\OldTransfer.txt";
            const string newTransferBin = "D:\\EWSTest\\NewTransfer.bin";
            const string newTransferTxt = "D:\\EWSTest\\NewTransfer.txt";
            const string outputFile = "D:\\EWSTest\\Output.bin";
            const string templateFile = "D:\\EWSTest\\Template.bin";

            if (File.Exists(oldTransferBin))
                File.Delete(oldTransferBin);
            if (File.Exists(oldTransferTxt))
                File.Delete(oldTransferTxt);
            if (File.Exists(newTransferBin))
                File.Delete(newTransferBin);
            if (File.Exists(newTransferTxt))
                File.Delete(newTransferTxt);
            if (File.Exists(outputFile))
                File.Delete(outputFile);

            var length = 0;
            foreach (byte[] temp in allBuffer)
            {
                length += temp.Length;
            }

            byte[] buffer = new byte[length];
            length = 0;
            foreach (byte[] temp in allBuffer)
            {
                Array.Copy(temp, 0, buffer, length, temp.Length);
                length += temp.Length;
            }

            using (FileStream fileStream = new FileStream(oldTransferBin, FileMode.OpenOrCreate))
            {
                fileStream.Write(buffer, 0, buffer.Length);
            }

            var split = "\t";
            int index = 0;
            using (StreamWriter writer = new StreamWriter(oldTransferTxt))
            {
                writer.Write("Num");
                writer.Write(split);
                writer.Write("Hex");
                writer.Write(split);
                writer.Write("Dec");
                writer.Write(split);
                writer.Write("Ch");
                writer.WriteLine();
                foreach (byte b in buffer)
                {
                    writer.Write(index++);
                    writer.Write(split);
                    writer.Write(b.ToString("X2"));
                    writer.Write(split);
                    writer.Write((int)b);
                    writer.Write(split);
                    writer.Write((char)b);
                    writer.WriteLine();
                }
            }

            FTBufferRead reader = new FTBufferRead(allBuffer);
            FTStreamParseContext.NewContext(reader);
            FTMessageTreeRoot root = new FTMessageTreeRoot();
            using (FTStreamParseContext.Instance)
            {
                root.Parse();
            }

            using (IFTStreamWriter writer = new FTStreamWriter(newTransferBin))
            {
                root.GetByteData(writer);
            }

            index = 0;
            using (FileStream readerAfterWriter = new FileStream(newTransferBin, FileMode.Open))
            {
                using (StreamWriter writer = new StreamWriter(newTransferTxt))
                {
                    writer.Write("Num");
                    writer.Write(split);
                    writer.Write("Hex");
                    writer.Write(split);
                    writer.Write("Dec");
                    writer.Write(split);
                    writer.Write("Ch");
                    writer.WriteLine();
                    while (true)
                    {
                        if (readerAfterWriter.Length == readerAfterWriter.Position)
                        {
                            break;
                        }
                        var b = readerAfterWriter.ReadByte();
                        writer.Write(index++);
                        writer.Write(split);
                        writer.Write(b.ToString("X2"));
                        writer.Write(split);
                        writer.Write((int)b);
                        writer.Write(split);
                        writer.Write((char)b);
                        writer.WriteLine();
                    }

                }
            }

            using (FileStream readerCom = new FileStream(oldTransferBin, FileMode.Open))
            {
                using (FileStream readerAfterWriter = new FileStream(newTransferBin, FileMode.Open))
                {
                    int readed = 0;
                    while (true)
                    {
                        if (readerCom.Length == readerCom.Position || readerAfterWriter.Length == readerAfterWriter.Position)
                        {
                            break;
                        }

                        var b1 = readerCom.ReadByte();
                        var b2 = readerAfterWriter.ReadByte();
                        readed++;

                        if (b1 != b2)
                        {
                            throw new NotSupportedException();
                        }
                    }
                }
            }

            IList<IFTTransferUnit> allTransferUnit = new List<IFTTransferUnit>();
            root.GetAllTransferUnit(allTransferUnit);

            int allUnitCount = 0;
            foreach(IFTTransferUnit unit in allTransferUnit)
            {
                allUnitCount += unit.BytesCount;
            }
            if (allUnitCount != root.BytesCount)
                throw new NotSupportedException();

            using (FileStream outputStream = new FileStream(outputFile, FileMode.CreateNew))
            {
                using (FTFileStream ftFileStream = new FTFileStream(templateFile))
                {
                    using (BinaryWriter writer = new BinaryWriter(outputStream))
                    {
                        ftFileStream.WriteConfigs(writer);
                        ftFileStream.WriteTransferData(allTransferUnit, writer);
                    }
                }
            }
        }
예제 #2
0
            public void AddUnit(IFTTransferUnit transferUnit)
            {
                var containerLeftCount = _container.LeftCount;
                var unitCount = transferUnit.BytesCount;

                byte[] buffer = new byte[unitCount];
                using (FTStreamWriter bwriter = new FTStreamWriter(buffer))
                {
                    ((IFTTreeNode)transferUnit).GetByteData(bwriter);
                }

                if (containerLeftCount > unitCount)
                {
                    _container.Write(buffer);
                }
                else if (containerLeftCount == unitCount)
                {
                    _container.Write(buffer);
                    OldContainerWrite(_container);
                    NewContainer();
                }
                else
                {

                    if (unitCount < pageCount)
                    {
                        OldContainerWrite(_container);
                        NewContainer();
                        _container.Write(buffer);
                    }
                    else
                    {
                        int unitIndex = 0;
                        _container.WriteLeftCount(buffer);
                        OldContainerWrite(_container);
                        NewContainer();
                        unitIndex += containerLeftCount;

                        while (unitCount - unitIndex >= pageCount)
                        {
                            _container.WritePageCount(buffer, unitIndex);
                            OldContainerWrite(_container);
                            NewContainer();
                            unitIndex += pageCount;
                        }

                        if (unitCount - unitIndex != 0)
                        {
                            _container.WriteLast(buffer, unitIndex);
                        }
                    }
                }
            }
예제 #3
0
 private void GenerateMessageBin(FTMessageTreeRoot root)
 {
     using (IFTStreamWriter writer = new FTStreamWriter(newTransferBin))
     {
         root.GetByteData(writer);
     }
 }