public static DwgSectionLocator Parse(BitReader reader) { var recordNumber = reader.ReadByte(); var pointer = reader.ReadInt(); var length = reader.ReadInt(); return(new DwgSectionLocator(recordNumber, pointer, length)); }
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}"); } } }
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()); }
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)); }
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."); } }
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); } }
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); }
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); }
public static byte Read_RC(this BitReader reader) { return(reader.ReadByte()); }