internal void Write(BitWriter writer, DwgObjectMap objectMap, HashSet <int> writtenHandles, int pointerOffset, DwgVersionId version) { if (!writtenHandles.Add(Handle.HandleOrOffset)) { // already been written return; } PrepareCommonValues(); OnBeforeObjectWrite(); SetCommonValues(); objectMap.SetOffset(Handle.HandleOrOffset, writer.Position); // write object to memory so the size can be computed using (var ms = new MemoryStream()) { var tempWriter = new BitWriter(ms); tempWriter.Write_BS((short)Type); WriteCommonDataStart(tempWriter, objectMap, pointerOffset); WriteSpecific(tempWriter, objectMap, pointerOffset, version); WriteCommonDataEnd(tempWriter, objectMap, pointerOffset); var tempBytes = tempWriter.AsBytes(); // now output everything writer.StartCrcCalculation(initialValue: DwgHeaderVariables.InitialCrcValue); writer.Write_MS(tempBytes.Length); writer.WriteBytes(tempBytes); writer.WriteCrc(); } foreach (var child in ChildItems) { child.Write(writer, objectMap, writtenHandles, pointerOffset, version); } }
public void WriteSimpleFileHeader() { var expected = new byte[] { (byte)'A', (byte)'C', (byte)'1', (byte)'0', (byte)'1', (byte)'4', 0, 0, 0, 0, 0, 42, // maintver 1, 0x78, 0x56, 0x34, 0x12, // image seeker 0, 0, // unknown 0x00, 0x01, // codepage 5, 0, 0, 0, // 5 section locators 0, 0, 0, 0, 0, 0, 0, 0, 0, // header locator 0, 0, 0, 0, 0, 0, 0, 0, 0, // class section locator 0, 0, 0, 0, 0, 0, 0, 0, 0, // object map locator 0, 0, 0, 0, 0, 0, 0, 0, 0, // unknown R13C3 and later locator 0, 0, 0, 0, 0, 0, 0, 0, 0, // unknown padding locator 0x63, 0xF1, // CRC 0x95, 0xA0, 0x4E, 0x28, 0x99, 0x82, 0x1A, 0xE5, // sentinel 0x5E, 0x41, 0xE0, 0x5F, 0x9D, 0x3A, 0x4D, 0x00, }; var fileHeader = new DwgFileHeader(DwgVersionId.R14, 42, 0x12345678, 256); using (var ms = new MemoryStream()) { var writer = new BitWriter(ms); fileHeader.Write(writer); var actual = writer.AsBytes(); Assert.Equal(expected, actual); } }
public void RoundTrip() { foreach (var version in AllVersions) { using (var ms = new MemoryStream()) { // write it var writer = new BitWriter(ms); var variables = new DwgHeaderVariables(); variables.Write(writer, version); // read it var reader = new BitReader(writer.AsBytes()); var variables2 = DwgHeaderVariables.Parse(reader, version); // this also verifies the CRC } } }