internal static DwgHeaderVariables Parse(BitReader reader, DwgVersionId version) { var header = new DwgHeaderVariables(); reader.ValidateSentinel(StartSentinel); reader.StartCrcCheck(); var size = reader.Read_RL(); var startOffset = reader.Offset; header.ReadVariables(reader, version); reader.AlignToByte(); var unreadByteCount = Math.Max(startOffset + size - reader.Offset, 0); var unreadBytes = reader.ReadBytes(unreadByteCount); reader.ValidateCrc(initialValue: InitialCrcValue); reader.ValidateSentinel(EndSentinel); return(header); }
internal static int ReadSecondHeader(BitReader reader, int byteCount) { var handleBytes = reader.ReadBytes(byteCount); if (!BitConverter.IsLittleEndian) { Array.Reverse(handleBytes); } var handle = 0; foreach (var b in handleBytes) { handle = (handle << 8) + b; } return(handle); }
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); }
internal static DwgImageData Parse(BitReader reader) { var imageData = new DwgImageData(); reader.ValidateSentinel(StartSentinel); var overallSize = reader.Read_RL(); var startOffset = reader.Offset; var imageCount = reader.Read_RC(); var headerStart = 0; var headerSize = 0; var bmpStart = 0; var bmpSize = 0; var wmfStart = 0; var wmfSize = 0; for (int i = 0; i < imageCount; i++) { var code = reader.Read_RC(); var start = reader.Read_RL(); var size = reader.Read_RL(); switch (code) { case 1: headerStart = start; headerSize = size; break; case 2: bmpStart = start; bmpSize = size; break; case 3: wmfStart = start; wmfSize = size; break; } } if (headerSize > 0) { if (reader.Offset != headerStart) { throw new DwgReadException("Unexpected image data header start."); } imageData.HeaderData = reader.ReadBytes(headerSize); } if (bmpSize > 0) { if (reader.Offset != bmpStart) { throw new DwgReadException("Unexpected BMP data start."); } imageData.BmpData = reader.ReadBytes(bmpSize); } if (wmfSize > 0) { if (reader.Offset != wmfStart) { throw new DwgReadException("Unexpected WMF data start."); } imageData.WmfData = reader.ReadBytes(wmfSize); } var endOffset = reader.Offset; var readBytes = endOffset - startOffset; if (readBytes != overallSize) { throw new DwgReadException($"Invalid count of read image data bytes. Expected: {overallSize}, Actual: {readBytes}"); } reader.ValidateSentinel(EndSentinel); return(imageData); }
public static byte[] Read_Bytes(this BitReader reader, int count) { return(reader.ReadBytes(count)); }