public async ValueTask Read(PrimitiveReader primitiveReader, CancellationToken cancellationToken) { BoolValue = await primitiveReader.ReadBool(cancellationToken); ByteValue = await primitiveReader.ReadByte(cancellationToken); SByteValue = await primitiveReader.ReadSByte(cancellationToken); ShortValue = await primitiveReader.ReadInt16(cancellationToken); UShortValue = await primitiveReader.ReadUInt16(cancellationToken); IntValue = await primitiveReader.ReadInt32(cancellationToken); UIntValue = await primitiveReader.ReadUInt32(cancellationToken); LongValue = await primitiveReader.ReadInt64(cancellationToken); ULongValue = await primitiveReader.ReadUInt64(cancellationToken); FloatValue = await primitiveReader.ReadSingle(cancellationToken); DoubleValue = await primitiveReader.ReadDouble(cancellationToken); StringValue = await primitiveReader.ReadString(cancellationToken); deserializationCounter++; }
public void ShouldWriteAndReadULongs( [Values(1, 10, 100, 10000, 1000 * 1000)] int numberOfULongs) { var randomULongs = Helpers.GetRandomLongs(numberOfULongs).Select(x => (ulong)x).ToArray(); var stream = new MemoryStream(); using (var writer = new PrimitiveWriter(stream, buffered)) { for (var i = 0; i < randomULongs.Length; i++) { writer.Write(randomULongs[i]); } } var position = stream.Position; stream.Seek(0, SeekOrigin.Begin); using (var reader = new PrimitiveReader(stream, buffered)) { for (var i = 0; i < randomULongs.Length; i++) { var read = reader.ReadUInt64(); Assert.AreEqual(randomULongs[i], read); } } Assert.AreEqual(position, stream.Position, StreamCorruptedMessage); }
public void ShouldReadAndWriteLimits() { var stream = new MemoryStream(); using (var writer = new PrimitiveWriter(stream)) { writer.Write(byte.MinValue); writer.Write(byte.MaxValue); writer.Write(sbyte.MinValue); writer.Write(sbyte.MaxValue); writer.Write(short.MinValue); writer.Write(short.MaxValue); writer.Write(ushort.MinValue); writer.Write(ushort.MaxValue); writer.Write(int.MinValue); writer.Write(int.MaxValue); writer.Write(uint.MinValue); writer.Write(uint.MaxValue); writer.Write(long.MinValue); writer.Write(long.MaxValue); writer.Write(ulong.MinValue); writer.Write(ulong.MaxValue); } var position = stream.Position; stream.Seek(0, SeekOrigin.Begin); using (var reader = new PrimitiveReader(stream)) { Assert.AreEqual(byte.MinValue, reader.ReadByte()); Assert.AreEqual(byte.MaxValue, reader.ReadByte()); Assert.AreEqual(sbyte.MinValue, reader.ReadSByte()); Assert.AreEqual(sbyte.MaxValue, reader.ReadSByte()); Assert.AreEqual(short.MinValue, reader.ReadInt16()); Assert.AreEqual(short.MaxValue, reader.ReadInt16()); Assert.AreEqual(ushort.MinValue, reader.ReadUInt16()); Assert.AreEqual(ushort.MaxValue, reader.ReadUInt16()); Assert.AreEqual(int.MinValue, reader.ReadInt32()); Assert.AreEqual(int.MaxValue, reader.ReadInt32()); Assert.AreEqual(uint.MinValue, reader.ReadUInt32()); Assert.AreEqual(uint.MaxValue, reader.ReadUInt32()); Assert.AreEqual(long.MinValue, reader.ReadInt64()); Assert.AreEqual(long.MaxValue, reader.ReadInt64()); Assert.AreEqual(ulong.MinValue, reader.ReadUInt64()); Assert.AreEqual(ulong.MaxValue, reader.ReadUInt64()); } Assert.AreEqual(position, stream.Position, StreamCorruptedMessage); }
public void Load(PrimitiveReader reader) { Id = reader.ReadUInt64(); Message = reader.ReadString(); SourceId = reader.ReadInt32(); ThreadId = reader.ReadInt32(); Time = new DateTime(reader.ReadInt64()); numericLogLevel = reader.ReadInt32(); if(ThreadId == -1) { ThreadId = null; } }
public void ShouldReadAndWriteLimits() { var stream = new MemoryStream(); using(var writer = new PrimitiveWriter(stream)) { writer.Write(byte.MinValue); writer.Write(byte.MaxValue); writer.Write(sbyte.MinValue); writer.Write(sbyte.MaxValue); writer.Write(short.MinValue); writer.Write(short.MaxValue); writer.Write(ushort.MinValue); writer.Write(ushort.MaxValue); writer.Write(int.MinValue); writer.Write(int.MaxValue); writer.Write(uint.MinValue); writer.Write(uint.MaxValue); writer.Write(long.MinValue); writer.Write(long.MaxValue); writer.Write(ulong.MinValue); writer.Write(ulong.MaxValue); } var position = stream.Position; stream.Seek(0, SeekOrigin.Begin); using(var reader = new PrimitiveReader(stream)) { Assert.AreEqual(byte.MinValue, reader.ReadByte()); Assert.AreEqual(byte.MaxValue, reader.ReadByte()); Assert.AreEqual(sbyte.MinValue, reader.ReadSByte()); Assert.AreEqual(sbyte.MaxValue, reader.ReadSByte()); Assert.AreEqual(short.MinValue, reader.ReadInt16()); Assert.AreEqual(short.MaxValue, reader.ReadInt16()); Assert.AreEqual(ushort.MinValue, reader.ReadUInt16()); Assert.AreEqual(ushort.MaxValue, reader.ReadUInt16()); Assert.AreEqual(int.MinValue, reader.ReadInt32()); Assert.AreEqual(int.MaxValue, reader.ReadInt32()); Assert.AreEqual(uint.MinValue, reader.ReadUInt32()); Assert.AreEqual(uint.MaxValue, reader.ReadUInt32()); Assert.AreEqual(long.MinValue, reader.ReadInt64()); Assert.AreEqual(long.MaxValue, reader.ReadInt64()); Assert.AreEqual(ulong.MinValue, reader.ReadUInt64()); Assert.AreEqual(ulong.MaxValue, reader.ReadUInt64()); } Assert.AreEqual(position, stream.Position, StreamCorruptedMessage); }
public void ShouldWriteAndReadULongs( [Values(1, 10, 100, 10000, 1000*1000)] int numberOfULongs) { var randomULongs = Helpers.GetRandomLongs(numberOfULongs).Select(x=>(ulong)x).ToArray(); var stream = new MemoryStream(); using(var writer = new PrimitiveWriter(stream, buffered)) { for(var i = 0; i < randomULongs.Length; i++) { writer.Write(randomULongs[i]); } } var position = stream.Position; stream.Seek(0, SeekOrigin.Begin); using(var reader = new PrimitiveReader(stream, buffered)) { for(var i = 0; i < randomULongs.Length; i++) { var read = reader.ReadUInt64(); Assert.AreEqual(randomULongs[i], read); } } Assert.AreEqual(position, stream.Position, StreamCorruptedMessage); }
void ProcessMetadataCuesheet( int len, PrimitiveReader reader ) { string catalogueNumber = reader.ReadASCIIString( 128 ); ulong leadInSamplesCount = reader.ReadUInt64(); byte format = reader.ReadByte(); // All bits other than 1 are reserved. bool compactDisc = ( format & 0x01 ) != 0; byte[] reserved = reader.ReadBytes( 258 ); byte trackCount = reader.ReadByte(); bool cdda = leadInSamplesCount != 0; for( int i = 0; i < trackCount; i++ ) { ulong trackOffset = reader.ReadUInt64(); byte trackNumber = reader.ReadByte(); bool leadOut = cdda ? trackNumber == 170 : trackNumber == 255; string isrc = reader.ReadASCIIString( 12 ); byte trackFlags = reader.ReadByte(); // All bits other than 1 and 2 are reserved. bool audio = ( trackFlags & 0x01 ) == 0; bool preEmphasis = ( trackFlags & 0x02 ) != 0; byte[] trackReserved = reader.ReadBytes( 13 ); byte indexCount = reader.ReadByte(); for( int j = 0; j < indexCount; j++ ) { ulong indexOffset = reader.ReadUInt64(); byte indexPointNumber = reader.ReadByte(); byte[] indexReserved = reader.ReadBytes( 3 ); } } }
void ProcessMetadataSeekTable( int len, PrimitiveReader reader ) { int pointCount = len / 18; for( int i = 0; i < pointCount; i++ ) { ulong firstSampleNumber = reader.ReadUInt64(); ulong targetFrameOffset = reader.ReadUInt64(); ushort numberSamples = reader.ReadUInt16(); bool isPlaceholder = firstSampleNumber == ulong.MaxValue; } }
public static MasterObject ReadFrom(PrimitiveReader reader, int i) { MasterObject value = new MasterObject(); byte objectType = reader.ReadUInt8(); value.ObjectType = objectType; value.UnitId = reader.ReadUInt16(); value.Unknown1 = reader.ReadUInt16(); value.Unknown2 = reader.ReadUInt16(); value.UnitClass = reader.ReadUInt16(); value.Unknown3 = reader.ReadBytes(6); const int breakId = -1; switch (objectType) { default: throw new NotImplementedException("Unsupported object type: " + objectType); case 10: // Basic units { short hitpoints = reader.ReadInt16(); float lengthOfSight = reader.ReadFloat32(); byte garrisonCapacity = reader.ReadUInt8(); float sizeRadiusX = reader.ReadFloat32(); float sizeRadiusY = reader.ReadFloat32(); ushort resourceCarriage = reader.ReadUInt16(); float resourceAmount = reader.ReadFloat32(); // Constants? ushort unknown12 = reader.ReadUInt16(); byte unknown13 = reader.ReadUInt8(); } break; case 25: // Same as 20, only DOPL uses this. case 20: // Extended basic units (FLAGX) { value.UnitData = reader.ReadBytes(28); PrimitiveReader r2 = new PrimitiveReader(value.UnitData); short hitpoints = r2.ReadInt16(); float lengthOfSight = r2.ReadFloat32(); byte garrisonCapacity = r2.ReadUInt8(); float sizeRadiusX = r2.ReadFloat32(); float sizeRadiusY = r2.ReadFloat32(); ulong unknown1 = r2.ReadUInt64(); ushort unknown2 = r2.ReadUInt16(); if (unknown1 != 0 || unknown2 != 0) { File.WriteAllBytes("unitextended.bin", value.UnitData); System.Diagnostics.Debugger.Break(); } // Constants? ushort unknown12 = r2.ReadUInt16(); byte unknown13 = r2.ReadUInt8(); if (i == breakId) { System.Diagnostics.Debugger.Break(); } } break; case 30: // Dead units { value.UnitData = reader.ReadBytes(32); if (i == breakId) { System.Diagnostics.Debugger.Break(); } } break; case 60: // Projectiles { short hitpoints = reader.ReadInt16(); float lengthOfSight = reader.ReadFloat32(); byte garrisonCapacity = reader.ReadUInt8(); float sizeRadiusX = reader.ReadFloat32(); float sizeRadiusY = reader.ReadFloat32(); short resourceCarriage = reader.ReadInt16(); float unknownFloat = reader.ReadFloat32(); byte unknown2 = reader.ReadUInt8(); float movementRate = reader.ReadFloat32(); float extraRotationSpeed = reader.ReadFloat32(); float searchRadius = reader.ReadFloat32(); float workRate = reader.ReadFloat32(); short unknown4 = reader.ReadInt16(); ushort attackStrengthsCount = reader.ReadUInt16(); AttackStrength[] strengths = new AttackStrength[attackStrengthsCount]; for (int j = 0; j < strengths.Length; j++) { strengths[j] = AttackStrength.ReadFrom(reader); } ushort armourStrengthsCount = reader.ReadUInt16(); ArmourStrength[] astrengths = new ArmourStrength[armourStrengthsCount]; for (int j = 0; j < astrengths.Length; j++) { astrengths[j] = ArmourStrength.ReadFrom(reader); } float reloadTime = reader.ReadFloat32(); float maximumRange = reader.ReadFloat32(); short accuracyPercentage = reader.ReadInt16(); short projectileUnitId = reader.ReadInt16(); short unknown7 = reader.ReadInt16(); float displayedAttackRange = reader.ReadFloat32(); float blastRadius = reader.ReadFloat32(); float minimumRange = reader.ReadFloat32(); // Constants? ushort unknown12 = reader.ReadUInt16(); byte unknown13 = reader.ReadUInt8(); if (unknown2 != 0) { System.Diagnostics.Debugger.Break(); } if (i == breakId) { System.Diagnostics.Debugger.Break(); } } break; case 70: // Living units { short hitpoints = reader.ReadInt16(); float lengthOfSight = reader.ReadFloat32(); byte garrisonCapacity = reader.ReadUInt8(); float sizeRadiusX = reader.ReadFloat32(); float sizeRadiusY = reader.ReadFloat32(); short resourceCarriage = reader.ReadInt16(); float storageAmount = reader.ReadFloat32(); // e.g. iron boar = 700 byte unknown2 = reader.ReadUInt8(); float movementRate = reader.ReadFloat32(); float extraRotationSpeed = reader.ReadFloat32(); // Rotation speed for extra parts - sails for ships. float searchRadius = reader.ReadFloat32(); float workRate = reader.ReadFloat32(); short unknown4 = reader.ReadInt16(); ushort attackStrengthsCount = reader.ReadUInt16(); AttackStrength[] strengths = new AttackStrength[attackStrengthsCount]; for (int j = 0; j < strengths.Length; j++) { strengths[j] = AttackStrength.ReadFrom(reader); } ushort armourStrengthsCount = reader.ReadUInt16(); ArmourStrength[] astrengths = new ArmourStrength[armourStrengthsCount]; for (int j = 0; j < astrengths.Length; j++) { astrengths[j] = ArmourStrength.ReadFrom(reader); } float reloadTime = reader.ReadFloat32(); float maximumRange = reader.ReadFloat32(); short accuracyPercentage = reader.ReadInt16(); short projectileUnitId = reader.ReadInt16(); short unknown7 = reader.ReadInt16(); float displayedAttackRange = reader.ReadFloat32(); float blastRadius = reader.ReadFloat32(); float minimumRange = reader.ReadFloat32(); ResourceCost res1 = ResourceCost.ReadFrom(reader); ResourceCost res2 = ResourceCost.ReadFrom(reader); ResourceCost res3 = ResourceCost.ReadFrom(reader); short trainingTime = reader.ReadInt16(); float missileDuplicationAmount = reader.ReadFloat32(); // Constants? ushort unknown12 = reader.ReadUInt16(); byte unknown13 = reader.ReadUInt8(); if (i == breakId) { System.Diagnostics.Debugger.Break(); } } break; case 80: // Buildings { short hitpoints = reader.ReadInt16(); float lengthOfSight = reader.ReadFloat32(); byte garrisonCapacity = reader.ReadUInt8(); float sizeRadius1 = reader.ReadFloat32(); float sizeRadius2 = reader.ReadFloat32(); short resourceCarriage = reader.ReadInt16(); float storageAmount = reader.ReadFloat32(); byte unknown2 = reader.ReadUInt8(); float movementRate = reader.ReadFloat32(); float extraRotationSpeed = reader.ReadFloat32(); // Rotation speed for extra parts - something for trebuchets. float searchRadius = reader.ReadFloat32(); float workRate = reader.ReadFloat32(); short unknown4 = reader.ReadInt16(); ushort attackStrengthsCount = reader.ReadUInt16(); AttackStrength[] strengths = new AttackStrength[attackStrengthsCount]; for (int j = 0; j < strengths.Length; j++) { strengths[j] = AttackStrength.ReadFrom(reader); } ushort armourStrengthsCount = reader.ReadUInt16(); ArmourStrength[] astrengths = new ArmourStrength[armourStrengthsCount]; for (int j = 0; j < astrengths.Length; j++) { astrengths[j] = ArmourStrength.ReadFrom(reader); } float reloadTime = reader.ReadFloat32(); float maximumRange = reader.ReadFloat32(); short accuracyPercentage = reader.ReadInt16(); short projectileUnitId = reader.ReadInt16(); short unknown7 = reader.ReadInt16(); // Seems to have something to do with buildings float displayedAttackRange = reader.ReadFloat32(); float blastRadius = reader.ReadFloat32(); float minimumRange = reader.ReadFloat32(); ResourceCost res1 = ResourceCost.ReadFrom(reader); ResourceCost res2 = ResourceCost.ReadFrom(reader); ResourceCost res3 = ResourceCost.ReadFrom(reader); short trainingTime = reader.ReadInt16(); float missileDuplicationAmount = reader.ReadFloat32(); ushort unknown14 = reader.ReadUInt16(); // No clue at all. // Constants? ushort unknown12 = reader.ReadUInt16(); byte unknown13 = reader.ReadUInt8(); if (i == breakId) { System.Diagnostics.Debugger.Break(); } } break; } return(value); }