public void ParsePacketMessages(Int32 dataLength) { Int64 packetStartOffset = Position; parsingPacket = true; // read in data block Byte[] frameData = fileReader.ReadBytes(dataLength); bitBuffer = new BitBuffer(frameData); BeginMessageLog(packetStartOffset, frameData); // parse messages while (true) { if (bitBuffer.BitsLeft < 8) { // done break; } Int32 messageFrameOffset = bitBuffer.CurrentBit; Byte messageId = (Byte)bitBuffer.ReadUnsignedBits(demo.NetworkProtocol >= 16 ? 6 : 5); if (demo.Protocol15Hack) { bitBuffer.SeekBits(1); } String messageName = Enum.GetName(typeof(MessageId), messageId); LogMessage(messageId, messageName, messageFrameOffset); MessageHandler messageHandler = FindMessageHandler(messageId); // unknown message if (messageHandler == null) { throw new ApplicationException(String.Format("Cannot find message handler for message id \"[{0}] {1}\"", messageId, messageName)); } // callback takes priority over length if (messageHandler.Callback != null) { messageHandler.Callback(); } else if (messageHandler.Length != -1) { Seek(messageHandler.Length); } else { throw new ApplicationException(String.Format("Unknown message id \"{0}\"", messageId)); } } parsingPacket = false; }
public void MessageEvent() { if (demo.NetworkProtocol <= 43) { bitBuffer.Endian = BitBuffer.EndianType.Big; } UInt32 nEvents = bitBuffer.ReadUnsignedBits(5); for (Int32 i = 0; i < nEvents; i++) { bitBuffer.SeekBits(10); // event index Boolean packetIndexBit = bitBuffer.ReadBoolean(); if (packetIndexBit) { bitBuffer.SeekBits(11); // packet index Boolean deltaBit = bitBuffer.ReadBoolean(); if (deltaBit) { GetDeltaStructure("event_t").ReadDelta(bitBuffer, null); } } Boolean fireTimeBit = bitBuffer.ReadBoolean(); if (fireTimeBit) { bitBuffer.SeekBits(16); // fire time } } bitBuffer.SkipRemainingBits(); bitBuffer.Endian = BitBuffer.EndianType.Little; }
public void Seek(Int64 offset, SeekOrigin origin) { if (parsingPacket) { bitBuffer.SeekBits((Int32)(offset * 8), origin); } else { fileStream.Seek(offset, origin); } }