Esempio n. 1
0
        public static short Read_BS(this BitReader reader)
        {
            var twoBits = reader.Read_BB();

            switch (twoBits)
            {
            case 0b00:
                return(reader.ReadShort());

            case 0b01:
                return(reader.ReadByte());

            case 0b10:
                return(0);

            default:
                return(256);
            }
        }
Esempio n. 2
0
        public static int Read_MS(this BitReader reader)
        {
            // read shorts until no high bit
            var   shorts = new Stack <short>();
            short s;

            do
            {
                s = reader.ReadShort();
                shorts.Push((short)(s & 0x7FFF)); // only take the lowest 15 bits
            } while ((s & 0x8000) != 0);          // while high bit set

            // re-create number
            int result = 0;

            while (shorts.Any())
            {
                result = (result << 15) + shorts.Pop();
            }

            return(result);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
 public static short Read_RS(this BitReader reader)
 {
     return(reader.ReadShort());
 }