internal static PsnDataPacketChunk Deserialize(PsnChunkHeader chunkHeader, PsnBinaryReader reader)
        {
            var subChunks = new List <PsnChunk>();

            foreach (var pair in FindSubChunkHeaders(reader, chunkHeader.DataLength))
            {
                reader.Seek(pair.Item2, SeekOrigin.Begin);

                switch ((PsnDataPacketChunkId)pair.Item1.ChunkId)
                {
                case PsnDataPacketChunkId.PsnDataHeader:
                    subChunks.Add(PsnDataHeaderChunk.Deserialize(pair.Item1, reader));
                    break;

                case PsnDataPacketChunkId.PsnDataTrackerList:
                    subChunks.Add(PsnDataTrackerListChunk.Deserialize(pair.Item1, reader));
                    break;

                default:
                    subChunks.Add(PsnUnknownChunk.Deserialize(pair.Item1, reader));
                    break;
                }
            }

            return(new PsnDataPacketChunk(subChunks));
        }
        internal static PsnDataTrackerChunk Deserialize(PsnChunkHeader chunkHeader, PsnBinaryReader reader)
        {
            var subChunks = new List <PsnChunk>();

            foreach (var pair in FindSubChunkHeaders(reader, chunkHeader.DataLength))
            {
                reader.Seek(pair.Item2, SeekOrigin.Begin);

                switch ((PsnDataTrackerChunkId)pair.Item1.ChunkId)
                {
                case PsnDataTrackerChunkId.PsnDataTrackerPos:
                    subChunks.Add(PsnDataTrackerPosChunk.Deserialize(chunkHeader, reader));
                    break;

                case PsnDataTrackerChunkId.PsnDataTrackerSpeed:
                    subChunks.Add(PsnDataTrackerSpeedChunk.Deserialize(chunkHeader, reader));
                    break;

                case PsnDataTrackerChunkId.PsnDataTrackerOri:
                    subChunks.Add(PsnDataTrackerOriChunk.Deserialize(chunkHeader, reader));
                    break;

                case PsnDataTrackerChunkId.PsnDataTrackerStatus:
                    subChunks.Add(PsnDataTrackerStatusChunk.Deserialize(chunkHeader, reader));
                    break;

                case PsnDataTrackerChunkId.PsnDataTrackerAccel:
                    subChunks.Add(PsnDataTrackerAccelChunk.Deserialize(chunkHeader, reader));
                    break;

                case PsnDataTrackerChunkId.PsnDataTrackerTrgtPos:
                    subChunks.Add(PsnDataTrackerTrgtPosChunk.Deserialize(chunkHeader, reader));
                    break;

                case PsnDataTrackerChunkId.PsnDataTrackerTimestamp:
                    subChunks.Add(PsnDataTrackerTimestampChunk.Deserialize(chunkHeader, reader));
                    break;

                default:
                    subChunks.Add(PsnUnknownChunk.Deserialize(chunkHeader, reader));
                    break;
                }
            }

            return(new PsnDataTrackerChunk(chunkHeader.ChunkId, subChunks));
        }