コード例 #1
0
ファイル: DwgFileHeader.cs プロジェクト: qingliu2018/dwg
        internal static DwgFileHeader Parse(BitReader reader)
        {
            reader.StartCrcCheck();
            var versionString = reader.ReadStringAscii(6);
            var version       = DwgVersionIdExtensions.VersionIdFromString(versionString);
            var unknown1      = reader.ReadBytes(6);
            var maintVer      = 0;

            if (version == DwgVersionId.R14)
            {
                maintVer = unknown1[5];
            }

            var marker = reader.ReadByte();

            if (marker != 1)
            {
                throw new DwgReadException("Expected value of 1 at offset 13.");
            }

            var imagePointer = reader.ReadInt();
            var unknown2     = reader.ReadBytes(2);
            var codePage     = reader.ReadShort();

            var header = new DwgFileHeader(version, maintVer, imagePointer, codePage);

            var recordLocatorCount = reader.ReadInt();

            for (int i = 0; i < recordLocatorCount; i++)
            {
                var locator = DwgSectionLocator.Parse(reader);
                switch (i)
                {
                case 0:
                    header.HeaderVariablesLocator = locator;
                    break;

                case 1:
                    header.ClassSectionLocator = locator;
                    break;

                case 2:
                    header.ObjectMapLocator = locator;
                    break;

                case 3:
                    header.UnknownSection_R13C3AndLaterLocator = locator;
                    break;

                case 4:
                    header.UnknownSection_PaddingLocator = locator;
                    break;
                }
            }

            ushort crcXorValue;

            switch (recordLocatorCount)
            {
            case 0:
            case 1:
            case 2:
                crcXorValue = 0;
                break;

            case 3:
                crcXorValue = 0xAD98;
                break;

            case 4:
                crcXorValue = 0x8101;
                break;

            case 5:
                crcXorValue = 0x3CC4;
                break;

            case 6:
                crcXorValue = 0x8461;
                break;

            default:
                throw new DwgReadException("Unsupported record locator count.");
            }

            reader.ValidateCrc(xorValue: crcXorValue);
            reader.ValidateSentinel(HeaderSentinel);

            return(header);
        }