コード例 #1
0
ファイル: DwgFileHeader.cs プロジェクト: qingliu2018/dwg
        internal void Write(BitWriter writer)
        {
            writer.StartCrcCalculation();
            writer.WriteStringAscii(Version.VersionString(), nullTerminated: false);
            writer.WriteBytes(0, 0, 0, 0, 0);
            if (Version == DwgVersionId.R14)
            {
                writer.WriteByte((byte)MaintenenceVersion);
            }
            else
            {
                writer.WriteByte(0);
            }

            writer.WriteByte(1);
            writer.WriteInt(ImagePointer);
            writer.WriteBytes(0, 0);
            writer.WriteShort(CodePage);

            writer.WriteInt(5); // 5 records
            HeaderVariablesLocator.Write(writer);
            ClassSectionLocator.Write(writer);
            ObjectMapLocator.Write(writer);
            UnknownSection_R13C3AndLaterLocator.Write(writer);
            UnknownSection_PaddingLocator.Write(writer);

            writer.WriteCrc(xorValue: 0x3CC4); // value for 5 records
            writer.WriteBytes(HeaderSentinel);
        }
コード例 #2
0
ファイル: DwgObjectMap.cs プロジェクト: qingliu2018/dwg
        private const int MaxSectionSizeBuffer = 10; // the maximum size of 2 MC values

        public void Write(BitWriter writer)
        {
            void WriteSection(byte[] data)
            {
                writer.StartCrcCalculation(initialValue: DwgHeaderVariables.InitialCrcValue);
                writer.WriteShortBigEndian((short)(data.Length + 2)); // account for crc
                writer.WriteBytes(data);
                writer.WriteCrc(writeCrcAsMsb: true);
            }

            // write in sections, each section is at most 2032 bytes, stop writing if remaining space is less than 10
            var sectionStart  = writer.Position;
            var lastHandle    = 0;
            var lastLocation  = 0;
            var ms            = new MemoryStream();
            var sectionWriter = new BitWriter(ms);

            foreach (var kvp in _handleOffsets.OrderBy(k => k.Key))
            {
                var sectionSize = writer.Position - sectionStart;
                if (sectionSize >= MaxSectionSize - MaxSectionSizeBuffer)
                {
                    // flush section
                    var sectionBytes = sectionWriter.AsBytes();
                    WriteSection(sectionBytes);
                    ms.Dispose();
                    ms            = new MemoryStream();
                    sectionWriter = new BitWriter(ms);
                    sectionStart  = writer.Position;
                }

                // now write the values
                var handleDiff   = kvp.Key - lastHandle;
                var locationDiff = kvp.Value - lastLocation;
                sectionWriter.Write_MC(handleDiff);
                sectionWriter.Write_MC(locationDiff);
                lastHandle   = kvp.Key;
                lastLocation = kvp.Value;
            }

            // flush the final section
            var finalBytes = sectionWriter.AsBytes();

            if (finalBytes.Length > 0)
            {
                WriteSection(finalBytes);
            }

            ms.Dispose();

            // always finish with an empty section
            WriteSection(new byte[0]);
        }
コード例 #3
0
ファイル: DwgHeaderVariables.cs プロジェクト: qingliu2018/dwg
        internal void Write(BitWriter writer, DwgVersionId version)
        {
            writer.AlignByte();
            using (var ms = new MemoryStream())
            {
                // write the variables to memory
                var variableWriter = new BitWriter(ms);
                WriteVariables(variableWriter, version);
                var variableBytes = variableWriter.AsBytes();

                // now write it all out
                writer.WriteBytes(StartSentinel);
                writer.StartCrcCalculation(initialValue: InitialCrcValue);
                writer.Write_RL(variableBytes.Length);
                writer.WriteBytes(variableBytes);
                writer.WriteCrc();
                writer.WriteBytes(EndSentinel);
            }
        }
コード例 #4
0
ファイル: DwgClasses.cs プロジェクト: qingliu2018/dwg
        internal static void Write(IList <DwgClassDefinition> classes, BitWriter writer)
        {
            writer.AlignByte();
            using (var ms = new MemoryStream())
            {
                // write the classes to memory
                var classWriter = new BitWriter(ms);
                foreach (var c in classes)
                {
                    c.Write(classWriter);
                }

                var classBytes = classWriter.AsBytes();

                // now write it all out
                writer.WriteBytes(StartSentinel);
                writer.StartCrcCalculation(initialValue: DwgHeaderVariables.InitialCrcValue);
                writer.Write_RL(classBytes.Length);
                writer.WriteBytes(classBytes);
                writer.WriteCrc();
                writer.WriteBytes(EndSentinel);
            }
        }