Beispiel #1
0
            public static DwgSectionLocator Parse(BitReader reader)
            {
                var recordNumber = reader.ReadByte();
                var pointer      = reader.ReadInt();
                var length       = reader.ReadInt();

                return(new DwgSectionLocator(recordNumber, pointer, length));
            }
Beispiel #2
0
 public static void ValidateBytes(this BitReader reader, byte[] expectedBytes)
 {
     for (int i = 0; i < expectedBytes.Length; i++)
     {
         var b = reader.ReadByte();
         if (b != expectedBytes[i])
         {
             throw new DwgReadException($"Invalid sentinel byte.  Expected: 0x{expectedBytes[i]:X}, Actual: 0x{b:X}");
         }
     }
 }
Beispiel #3
0
        public static string Read_T(this BitReader reader)
        {
            var length = reader.Read_BS();
            var sb     = new StringBuilder();

            for (int i = 0; i < length; i++)
            {
                sb.Append((char)reader.ReadByte());
            }

            return(sb.ToString());
        }
Beispiel #4
0
        public static DwgHandleReference Read_H(this BitReader reader)
        {
            var code    = reader.ReadBits(4);
            var counter = reader.ReadBits(4);
            var offset  = 0;

            for (int i = 0; i < counter; i++)
            {
                var b = reader.ReadByte();
                offset = (offset << 8) + b;
            }

            return(new DwgHandleReference((DwgHandleReferenceCode)code, offset));
        }
Beispiel #5
0
        public static int Read_BL(this BitReader reader)
        {
            var twoBits = reader.Read_BB();

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

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

            case 0b10:
                return(0);

            default:
                throw new DwgReadException("Unsupported bit code.");
            }
        }
Beispiel #6
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);
            }
        }
Beispiel #7
0
        public static int Read_MC(this BitReader reader, bool allowNegation = true)
        {
            // read bytes until no high bit
            var  bytes = new Stack <byte>();
            byte b;

            do
            {
                b = reader.ReadByte();
                bytes.Push((byte)(b & 0x7F)); // only take lowest 7 bits
            } while ((b & 0x80) != 0);        // while high bit set

            bool negate = false;

            if (allowNegation && (b & 0x40) != 0)
            {
                negate = true;
                bytes.Pop();
                bytes.Push((byte)(b & 0x3F));
            }

            // re-create number
            int result = 0;

            while (bytes.Any())
            {
                result = (result << 7) + bytes.Pop();
            }

            if (negate)
            {
                result *= -1;
            }

            return(result);
        }
Beispiel #8
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);
        }
Beispiel #9
0
 public static byte Read_RC(this BitReader reader)
 {
     return(reader.ReadByte());
 }