Пример #1
1
        public static byte[] Decode(byte[] data, int from, int to, int bitsInterval)
        {
            var copiedData = new byte[to - from + 1];
            Array.Copy(data, from, copiedData, 0, copiedData.Length);

            byte[] reverseBytes = Convert.ReverseBitsInBytes(copiedData);

            using (var s = new MemoryStream(reverseBytes))
            using (var reader = new BitReader(s))
            {
                using (var decoded = new MemoryStream())
                using (var writer = new BitWriter(decoded))
                {
                    int counter = 0;
                    while (reader.CanRead)
                    {
                        byte bit = reader.ReadBits(1);
                        writer.WriteBit(bit);
                        counter = (bit == 1) ? counter + 1 : 0;
                        if (counter == bitsInterval)
                        {
                            reader.ReadBits(1); // skip next 0 bit
                            counter = 0;
                        }
                    }

                    // !! do not flush last bits
                    return Convert.ReverseBitsInBytes(decoded.ToArray());
                }
            }
        }
Пример #2
0
        public static void Load(string fName)
        {
            using (Stream s = File.OpenRead(fName))
            {
                using (BitReader read = new BitReader(s))
                {
                    int c = read.ReadInt();
                    for (int i = 0; i < c; i++)
                    {
                        TDBTactic t = new TDBTactic();
                        t.ItemId = read.ReadInt();
                        t.Species = read.ReadInt();
                        t.uInt1 = read.ReadInt();
                        t.Data = read.ReadInt();
                        t.uInt2 = read.ReadInt();
                        t.uInt3 = read.ReadInt();
                        t.uInt4 = read.ReadInt();

                        Tactics.Add(t.ItemId, t);
                    }

                    //More data at the end. Digimon names and descriptions.
                }
            }
            Console.WriteLine("[TacticsDB] Loaded {0} entries.", Tactics.Count);
        }
Пример #3
0
        public static byte[] Encode(byte[] data, int bitsInterval)
        {
            byte[] reverseBytes = Convert.ReverseBitsInBytes(data);

            using (var s = new MemoryStream(reverseBytes))
            using (var reader = new BitReader(s))
            {
                using (var encoded = new MemoryStream())
                using (var writer = new BitWriter(encoded))
                {
                    int counter = 0;
                    while (reader.CanRead)
                    {
                        byte bit = reader.ReadBits(1);
                        writer.WriteBit(bit);
                        counter = (bit == 1) ? counter + 1 : 0;
                        if (counter == bitsInterval)
                        {
                            writer.WriteBit(0);
                            counter = 0;
                        }
                    }

                    writer.FlushBits();
                    return Convert.ReverseBitsInBytes(encoded.ToArray());
                }
            }
        }
 public static ClientLoadouts Deserialize(BitReader br)
 {
     var clo = new ClientLoadouts();
     clo.Loadout1 = ClientLoadout.Deserialize(br);
     clo.Loadout2 = ClientLoadout.Deserialize(br);
     return clo;
 }
 public static ClientLoadoutOnlineThing Deserialize(BitReader br)
 {
     var clot = new ClientLoadoutOnlineThing(); // ha, "clot"
     clot.Unknown1 = br.ReadUInt32();
     clot.Unknown2 = br.ReadUInt32Max(MAX_UNKNOWN2);
     return clot;
 }
        public static Reservation Deserialize(UInt32 versionMajor, UInt32 versionMinor, BitReader br)
        {
            var r = new Reservation();

            r.Unknown1 = br.ReadUInt32FromBits(3);

            r.PlayerId = UniqueId.Deserialize(br);

            if (r.PlayerId.Type != UniqueId.UniqueIdType.Unknown)
            {
                r.PlayerName = br.ReadString();
            }

            if (versionMajor < 868 || versionMinor < 12)
            {
                r.Unknown2 = br.ReadBitsAsBytes(2)[0];
            }
            else
            {
                r.Unknown2 = br.ReadByte();
            }
            /*
                ReservationStatus_None,
            ReservationStatus_Reserved,
            ReservationStatus_Joining,
            ReservationStatus_InGame,
            ReservationStatus_MAX
             */

            return r;
        }
        public SendResourcesEvent(BitReader bitReader, Replay replay)
        {
            this.EventType = GameEventType.Other;

            var playerId = (int)bitReader.Read(4);
            Target = replay.GetPlayerById(playerId);

            var someFlags = (int)bitReader.Read(3);

            if (someFlags-- > 0) // 4
            {
                MineralsSent = ReadSignedAmount(bitReader.Read(32));
            }
            if (someFlags-- > 0) // 3
            {
                VespeneSent = ReadSignedAmount(bitReader.Read(32));
            }
            if (someFlags-- > 0) // 2
            {
                TerrazineSent = ReadSignedAmount(bitReader.Read(32));
            }
            if (someFlags-- > 0) // 1
            {
                CustomSent = ReadSignedAmount(bitReader.Read(32));
            }
        }
Пример #8
0
        public CameraEvent(BitReader bitReader, Replay replay)
        {
            TargetX = CFixedToDouble(bitReader.Read(16));
            TargetY = CFixedToDouble(bitReader.Read(16));

            HasDistance = bitReader.Read(1) != 0;
            if (HasDistance)
            {
                Distance = CFixedToDouble(bitReader.Read(16));
            }

            HasPitch = bitReader.Read(1) != 0;
            if (HasPitch)
            {
                Pitch = RotationAmountToDegrees(bitReader.Read(16));
            }

            HasYaw = bitReader.Read(1) != 0;
            if (HasYaw)
            {
                Yaw = RotationAmountToDegrees(bitReader.Read(16));
            }

            HasHeightOffset = bitReader.Read(1) != 0;
            if (HasHeightOffset)
            {
                // Debug since we're unsure
                HeightOffset = CFixedToDouble(bitReader.Read(16));
            }

            this.EventType = GameEventType.Other;
        }
Пример #9
0
        public override void ReadSetupData( VorbisCodec codec, BitReader reader )
        {
            int residueBegin = reader.ReadBits( 24 );
            int residueEnd = reader.ReadBits( 24 );
            int partitionSize = reader.ReadBits( 24 ) + 1;
            int classifications = reader.ReadBits( 6 ) + 1;
            int classbook = reader.ReadBits( 8 );

            byte[] residueCascade = new byte[classifications];
            for( int i = 0; i < residueCascade.Length; i++ ) {
                int highBits = 0;
                int lowBits = reader.ReadBits( 3 );
                if( reader.ReadBit() == 1 )
                    highBits = reader.ReadBits( 5 );
                residueCascade[i] = (byte)( lowBits | ( highBits << 3 ) );
            }

            byte[][] bookNumbers = new byte[classifications][];
            for( int i = 0; i < bookNumbers.Length; i++ ) {
                byte[] nums = new byte[8];
                int cascade = residueCascade[i];
                for( int j = 0; j < nums.Length; j++ ) {
                    if( ( cascade & ( 1 << j ) ) != 0 ) {
                        nums[j] = (byte)reader.ReadBits( 8 );
                    }
                }
                bookNumbers[i] = nums;
            }
        }
Пример #10
0
 public static ActiveActor Deserialize(BitReader br)
 {
     var aa = new ActiveActor();
     aa.Active = br.ReadBit();
     aa.ActorId = br.ReadUInt32();
     return aa;
 }
Пример #11
0
        public PlayerJoinEvent(BitReader bitReader, Replay replay, int playerIndex)
        {
            this.EventType = GameEventType.Inactive;

            // This should probably be a series of {shl; or} on .Read(1)
            // to make it version-independent
            if (replay.ReplayBuild < 22612)
            {
                this.JoinFlags = (int)bitReader.Read(4);
            }
            else
            {
                this.JoinFlags = (int)bitReader.Read(12); // unknown
            }

            // Initialize player if not exists (true for observers)
            Player player = replay.GetPlayerById(playerIndex);
            if (player == null)
            {
                var p = new Player { PlayerType = PlayerType.Spectator };
                replay.ClientList[playerIndex] = player = p;
            }

            // Initialize wireframe
            player.Wireframe = new List<Unit>();
            player.WireframeSubgroup = 0;

            // Initialize control groups
            player.Hotkeys = new List<Unit>[10];
        }
Пример #12
0
 public override object ApplyToFrame( VorbisCodec codec, BitReader reader, object args )
 {
     step2Flag[0] = true; step2Flag[1] = true;
     finalY[0] = yList[0]; finalY[1] = yList[1];
     SynthesiseAmplitudeValues();
     return SynthesiseCurve( (int)args );
 }
        public static ClientLoadoutOnline Deserialize(BitReader br)
        {
            var clo = new ClientLoadoutOnline();
            clo.ThingLists = new List<List<ClientLoadoutOnlineThing>>();

            var listCount = br.ReadByte();
            for (int i = 0; i < listCount; ++i)
            {
                var thingList = new List<ClientLoadoutOnlineThing>();

                var thingCount = br.ReadByte();
                for (int j = 0; j < thingCount; ++j)
                {
                    thingList.Add(ClientLoadoutOnlineThing.Deserialize(br));

                    if ( i >= 21 )
                    {
                        thingList.Add(ClientLoadoutOnlineThing.Deserialize(br));
                    }
                }

                clo.ThingLists.Add(thingList);
            }

            return clo;
        }
Пример #14
0
        public static void Load(string fileName)
        {
            if (MapList.Count > 0) return;
            using (Stream s = File.OpenRead(fileName))
            {
                using (BitReader read = new BitReader(s))
                {

                    int count = read.ReadInt();
                    for (int i = 0; i < count; i++)
                    {
                        read.Seek(4 + i * 672);
                        MapData map = new MapData();
                        map.MapID = read.ReadInt();

                        map.MapNumber = read.ReadInt();
                        read.Skip(4);
                        map.Name = read.ReadZString(Encoding.ASCII);
                        read.Skip(672 - (int)(336 + (read.InnerStream.BaseStream.Position - (672 * i)) - 4));

                        map.DisplayName = read.ReadZString(Encoding.Unicode);

                        MapList.Add(map.MapID, map);
                    }
                }
            }
            Console.WriteLine("[MapDB] Loaded {0} maps.", MapList.Count);
        }
Пример #15
0
        internal static short ReadCoefValue(BitReader bReader, uint size)
        {
            if (size == 0) return 0;

            ushort specialBits = bReader.Read(size);

            return SpecialBitsToValue(specialBits, (short)size);
        }
Пример #16
0
 public void SetData(ref BitReader Src, int CountBits)
 {
     Num = CountBits;
     Pos = 0;
     Src.Data = null;
     Src.Data = new byte[((CountBits + 7) >> 3)];
     Src.SerializeBits(Src.Data, CountBits);
 }
Пример #17
0
        public void Decode(BitReader reader, Stream writer)
        {
            if (!writer.CanWrite)
                throw new InvalidOperationException();

            m_reader = reader;

            Decode(writer);
        }
Пример #18
0
        internal static ushort ReadRunAmplitude(BitReader bReader, HuffmanTable table)
        {
            ushort code = bReader.Peek(table.maxCodeLength);

            CodeInfo currentCode = table.preIndexTable[code];
            bReader.Read(currentCode.length);

            return currentCode.number;
        }
Пример #19
0
        public static void Decompress(string inputFile, string outputFile)
        {
            var decoder = new Decoder();

            using (var reader = new BitReader(inputFile))
            using (var writer = new FileStream(outputFile, FileMode.Create))
            {
                decoder.Decode(reader, writer);
            }
        }
Пример #20
0
        public static void GetGraphicInfo(BitReader reader, ref Item item)
        {
            item.has_graphic = reader.ReadBit(); ;
            if (item.has_graphic)
                item.graphic = (byte)reader.Read(3);

            item.has_colour = reader.ReadBit();
            if (item.has_colour)
                item.colour = (UInt16)reader.Read(11);
        }
Пример #21
0
        public static WeldedInfo Deserialize(BitReader br)
        {
            var wi = new WeldedInfo();
            wi.Active = br.ReadBit();
            wi.ActorId = br.ReadInt32();
            wi.Offset = Vector3D.Deserialize(br);
            wi.Mass = br.ReadFloat();
            wi.Rotation = Rotator.Deserialize(br);

            return wi;
        }
Пример #22
0
        const int blkSize = ImgInfo.blockSize; // JPEG decoding block size is 8x8

        #endregion Fields

        #region Methods

        internal static void DecodeBlock(BitReader bReader, ImgInfo imgInfo, float[,] img,
            int compIndex, int ofsX, int ofsY, int scaleX, int scaleY)
        {
            int quantIndex = imgInfo.components[compIndex].quantTableId;

            short[] coefZig = GetCoefficients(bReader, imgInfo, compIndex, blkSize * blkSize);
            FileOps.ZigZagToArray(coefZig, coefDctQnt, FileOps.tablasZigzag[blkSize], blkSize);
            ImgOps.Dequant(coefDctQnt, coefDct, imgInfo.quantTables[quantIndex].table, blkSize);
            ImgOps.Fidct(coefDct, blockP, blkSize, blkSize);

            ImgOps.ResizeAndInsertBlock(imgInfo, blockP, img, blkSize, blkSize, ofsX, ofsY, scaleX, scaleY);
        }
Пример #23
0
        public static TeamPaint Deserialize(BitReader br)
        {
            var tp = new TeamPaint();

            tp.TeamNumber = br.ReadByte();
            tp.TeamColorId = br.ReadByte();
            tp.CustomColorId = br.ReadByte();
            tp.TeamFinishId = br.ReadUInt32();
            tp.CustomFinishId = br.ReadUInt32();

            return tp;
        }
        public static PrivateMatchSettings Deserialize(BitReader br)
        {
            var pms = new PrivateMatchSettings();
            pms.Mutators = br.ReadString().Split(',').ToList();
            pms.Unknown1 = br.ReadUInt32(); // GameNameId? Possibly referencing a string by id
            pms.Unknown2 = br.ReadUInt32(); // Max players?
            pms.GameName = br.ReadString();
            pms.Password = br.ReadString();
            pms.Unknown3 = br.ReadBit(); // Public?

            return pms;
        }
        public static ReplicatedDemolish Deserialize(BitReader br)
        {
            var rd = new ReplicatedDemolish();

            rd.Unknown1 = br.ReadBit();
            rd.AttackerActorId = br.ReadUInt32();
            rd.Unknown2 = br.ReadBit();
            rd.VictimActorId = br.ReadUInt32();
            rd.AttackerVelocity = Vector3D.Deserialize(br);
            rd.VictimVelocity = Vector3D.Deserialize(br);

            return rd;
        }
        public static CameraSettings Deserialize(BitReader br)
        {
            var cs = new CameraSettings();

            cs.FieldOfView = br.ReadFloat();
            cs.Height = br.ReadFloat();
            cs.Pitch = br.ReadFloat();
            cs.Distance = br.ReadFloat();
            cs.Stiffness = br.ReadFloat();
            cs.SwivelSpeed = br.ReadFloat();

            return cs;
        }
Пример #27
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Deflate" /> class.
        /// </summary>
        /// <param name="reader">The reader.</param>
        private Deflate(BitReader reader)
        {
            this.input = reader;
            this.outputStream = new MemoryStream();
            this.output = new BinaryWriter(this.outputStream);
            this.dictionary = new CircularDictionary(32 * 1024);

            // Process the stream of blocks
            while (true)
            {
                // Block header
                var isFinal = this.input.ReadNoEof() != -1; // bfinal
                var type = this.ReadInt(2); // btype

                // Decompress by type
                if (type == 0)
                {
                    this.DecompressUncompressedBlock();
                }
                else if (type == 1 || type == 2)
                {
                    CodeTree litLenCode, distCode;
                    if (type == 1)
                    {
                        litLenCode = FixedLiteralLengthCode;
                        distCode = FixedDistanceCode;
                    }
                    else
                    {
                        var temp = this.DecodeHuffmanCodes();
                        litLenCode = temp[0];
                        distCode = temp[1];
                    }

                    this.DecompressHuffmanBlock(litLenCode, distCode);
                }
                else if (type == 3)
                {
                    throw new FormatException("Invalid block type");
                }
                else
                {
                    throw new NotImplementedException();
                }

                if (isFinal)
                {
                    break;
                }
            }
        }
Пример #28
0
        public static ulong GammaDecode(BitReader reader)
        {
            int size = 0;

            while (reader.ReadBit() == false)
                size++;

            ulong result = 1;

            for (int i = 0; i < size; i++)
                result = (result << 1) + (reader.ReadBit() ? 1UL : 0UL);

            return result - 1;
        }
        public static RigidBodyState Deserialize(BitReader br)
        {
            var rbs = new RigidBodyState();
            rbs.Sleeping = br.ReadBit();
            rbs.Position = Vector3D.Deserialize(br);
            rbs.Rotation = Vector3D.DeserializeFixed(br);

            if (!rbs.Sleeping)
            {
                rbs.LinearVelocity = Vector3D.Deserialize(br);
                rbs.AngularVelocity = Vector3D.Deserialize(br);
            }

            return rbs;
        }
Пример #30
0
        static void Main(string[] args)
        {
            if (args.Length != 2)
            {
                Console.WriteLine("Usage GpxExtractor Mode PathToGpx");
                Console.WriteLine("Mode can be extract or decompress");
                return;
            }

            var gpxFs = new GpxFileSystem();
            var dir = Path.Combine(Path.GetDirectoryName(args[1]), Path.GetFileNameWithoutExtension(args[1]));
            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }

            var mode = args[0];
            switch (mode)
            {
                case "extract":

                    gpxFs.Load(ByteBuffer.FromBuffer(File.ReadAllBytes(args[1])));

                    foreach (var file in gpxFs.Files)
                    {
                        Console.WriteLine("Extracting {0}", file.FileName);
                        File.WriteAllBytes(Path.Combine(dir, file.FileName), file.Data);
                    }

                    break;
                case "decompress":

                    var src = new BitReader(ByteBuffer.FromBuffer(File.ReadAllBytes(args[1])));

                    var header = gpxFs.ReadHeader(src);
                    Console.WriteLine("Found Header: {0}", header);

                    if (header != GpxFileSystem.HeaderBcFz)
                    {
                        Console.WriteLine("The requested file is no compressed gpx");
                        return;
                    }

                    var decompressed = gpxFs.Decompress(src);
                    File.WriteAllBytes(Path.Combine(dir, "Decompressed.gpx"), decompressed);
                    break;
            }
        }
Пример #31
0
	void OnEntityCreate( BitReader reader )
	{
		Entity.Spawn spawn = new Entity.Spawn();
		spawn.Read( reader );
		SpawnEntityClient( spawn );
	}
Пример #32
0
        public static async Task ExportToWavefrontAsync(this LuzFile @this, AccessDatabase database, string source, string resources, string result)
        {
            TerrainFile terrain;

            await using (var stream = File.OpenRead(Path.Combine(source, @this.TerrainFileName)))
            {
                using var reader = new BitReader(stream);

                terrain = new TerrainFile();

                terrain.Deserialize(reader);
            }

            var levels = new LvlFile[@this.Scenes.Length];

            for (var i = 0; i < @this.Scenes.Length; i++)
            {
                var scene = @this.Scenes[i];

                await using var stream = File.OpenRead(Path.Combine(source, scene.FileName));

                using var reader = new BitReader(stream);

                var level = new LvlFile();

                level.Deserialize(reader);

                levels[i] = level;
            }

            var objects = new List <LevelObjectTemplate>();

            foreach (var level in levels)
            {
                if (level.LevelObjects?.Templates == default)
                {
                    continue;
                }

                foreach (var template in level.LevelObjects.Templates)
                {
                    if (!template.LegoInfo.TryGetValue("add_to_navmesh", out var add))
                    {
                        continue;
                    }

                    if (!(bool)add)
                    {
                        continue;
                    }

                    objects.Add(template);
                }
            }

            foreach (var template in objects)
            {
                var instance = database.LoadObject(template.Lot);

                var renderer = instance.GetComponent <RenderComponentTable>();

                if (renderer == default)
                {
                    continue;
                }

                Console.WriteLine(renderer.render_asset);
            }
        }
Пример #33
0
 internal abstract void ParseSpecific(BitReader reader, DwgVersionId version);
Пример #34
0
 internal virtual void OnAfterObjectRead(BitReader reader, DwgObjectCache objectCache)
 {
 }
Пример #35
0
 public virtual void Deserialize(BitReader reader)
 {
     Behavior = (PathBehavior)reader.Read <uint>();
 }
Пример #36
0
 protected virtual void DeserializeImpl(BitReader br)
 {
     Unknown1 = br.ReadBit();
     ActorId  = br.ReadUInt32();
     Position = Vector3D.Deserialize(br);
 }
        public static ActorStateProperty Deserialize(IClassNetCache classMap, string[] objectIndexToName, UInt32 engineVersion, UInt32 licenseeVersion, UInt32 netVersion, BitReader br)
        {
            var asp = new ActorStateProperty();

            asp._classNetCache = classMap;
            var maxPropId = classMap.MaxPropertyId;

            asp.PropertyId   = br.ReadUInt32Max(maxPropId + 1);
            asp.PropertyName = objectIndexToName[classMap.GetProperty((int)asp.PropertyId).Index];

            asp.Data = new List <object>();

            switch (asp.PropertyName)
            {
            case "TAGame.GameEvent_TA:ReplicatedStateIndex":
                asp.Data = br.ReadUInt32Max(140);     // number is made up, I dont know the max yet // TODO: Revisit this. It might work well enough, but looks fishy
                break;

            case "TAGame.RBActor_TA:ReplicatedRBState":
                asp.Data = RigidBodyState.Deserialize(br, netVersion);
                break;

            case "TAGame.Team_TA:LogoData":
                asp.Data = LogoData.Deserialize(br);
                break;

            case "TAGame.CrowdManager_TA:GameEvent":
            case "TAGame.CrowdActor_TA:GameEvent":
            case "TAGame.PRI_TA:PersistentCamera":
            case "TAGame.Team_TA:GameEvent":
            case "TAGame.Ball_TA:GameEvent":
            case "Engine.PlayerReplicationInfo:Team":
            case "Engine.Pawn:PlayerReplicationInfo":
            case "TAGame.PRI_TA:ReplicatedGameEvent":
            case "TAGame.CarComponent_TA:Vehicle":
            case "TAGame.Car_TA:AttachedPickup":
            case "TAGame.SpecialPickup_Targeted_TA:Targeted":
            case "TAGame.CameraSettingsActor_TA:PRI":
            case "TAGame.GameEvent_Soccar_TA:MVP":
            case "TAGame.GameEvent_Soccar_TA:MatchWinner":
            case "TAGame.GameEvent_Soccar_TA:GameWinner":
            case "Engine.ReplicatedActor_ORS:ReplicatedOwner":
            case "TAGame.Car_TA:RumblePickups":
            case "TAGame.RumblePickups_TA:AttachedPickup":
                asp.Data = ActiveActor.Deserialize(br);
                break;

            case "TAGame.CrowdManager_TA:ReplicatedGlobalOneShotSound":
            case "TAGame.CrowdActor_TA:ReplicatedOneShotSound":
            case "TAGame.GameEvent_TA:MatchTypeClass":
            case "Engine.GameReplicationInfo:GameClass":
            case "TAGame.GameEvent_Soccar_TA:SubRulesArchetype":
            case "TAGame.Ball_TA:ReplicatedPhysMatOverride":
                var objectTarget = ObjectTarget.Deserialize(br);
                asp.Data = objectTarget;
                ValidateObjectIndex(objectTarget.ObjectIndex, objectIndexToName);
                break;

            case "Engine.GameReplicationInfo:ServerName":
            case "Engine.PlayerReplicationInfo:PlayerName":
            case "TAGame.Team_TA:CustomTeamName":
            case "Engine.PlayerReplicationInfo:RemoteUserData":
            case "TAGame.GRI_TA:NewDedicatedServerIP":
            case "ProjectX.GRI_X:MatchGUID":
                asp.Data = br.ReadString();
                break;

            case "TAGame.GameEvent_Soccar_TA:SecondsRemaining":
            case "TAGame.GameEvent_TA:ReplicatedGameStateTimeRemaining":
            case "TAGame.CrowdActor_TA:ReplicatedCountDownNumber":
            case "TAGame.GameEvent_Team_TA:MaxTeamSize":
            case "Engine.PlayerReplicationInfo:PlayerID":
            case "TAGame.PRI_TA:TotalXP":
            case "TAGame.PRI_TA:MatchScore":
            case "TAGame.GameEvent_Soccar_TA:RoundNum":
            case "TAGame.GameEvent_TA:BotSkill":
            case "TAGame.PRI_TA:MatchShots":
            case "TAGame.PRI_TA:MatchSaves":
            case "ProjectX.GRI_X:ReplicatedGamePlaylist":
            case "Engine.TeamInfo:Score":
            case "Engine.PlayerReplicationInfo:Score":
            case "TAGame.PRI_TA:MatchGoals":
            case "TAGame.PRI_TA:MatchAssists":
            case "TAGame.PRI_TA:Title":
            case "TAGame.GameEvent_TA:ReplicatedStateName":
            case "TAGame.Team_Soccar_TA:GameScore":
            case "TAGame.GameEvent_Soccar_TA:GameTime":
            case "TAGame.CarComponent_Boost_TA:UnlimitedBoostRefCount":
            case "TAGame.CrowdActor_TA:ReplicatedRoundCountDownNumber":
            case "TAGame.Ball_Breakout_TA:DamageIndex":
            case "TAGame.PRI_TA:MatchBreakoutDamage":
            case "TAGame.PRI_TA:BotProductName":
            case "TAGame.GameEvent_TA:ReplicatedRoundCountDownNumber":
            case "TAGame.GameEvent_Soccar_TA:SeriesLength":
            case "TAGame.PRI_TA:SpectatorShortcut":
            case "Engine.Pawn:HealthMax":
            case "TAGame.GameEvent_Soccar_TA:MaxScore":
            case "TAGame.Team_TA:Difficulty":
            case "TAGame.RumblePickups_TA:ConcurrentItemCount":
                asp.Data = br.ReadUInt32();
                break;

            case "ProjectX.GRI_X:ReplicatedGameMutatorIndex":
            case "TAGame.PRI_TA:TimeTillItem":
            case "TAGame.PRI_TA:MaxTimeTillItem":
                asp.Data = br.ReadInt32();
                break;

            case "TAGame.VehiclePickup_TA:ReplicatedPickupData":
                asp.Data = ReplicatedPickupData.Deserialize(br);
                break;

            case "Engine.PlayerReplicationInfo:Ping":
            case "TAGame.Vehicle_TA:ReplicatedSteer":
            case "TAGame.Vehicle_TA:ReplicatedThrottle":     // 0: full reverse, 128: No throttle.  255 full throttle/boosting
            case "TAGame.PRI_TA:CameraYaw":
            case "TAGame.PRI_TA:CameraPitch":
            case "TAGame.Ball_TA:HitTeamNum":
            case "TAGame.GameEvent_Soccar_TA:ReplicatedScoredOnTeam":
            case "TAGame.CarComponent_Boost_TA:ReplicatedBoostAmount":
            case "TAGame.CameraSettingsActor_TA:CameraPitch":
            case "TAGame.CameraSettingsActor_TA:CameraYaw":
            case "TAGame.PRI_TA:PawnType":
            case "TAGame.Ball_Breakout_TA:LastTeamTouch":
            case "TAGame.Ball_Haunted_TA:LastTeamTouch":
            case "TAGame.PRI_TA:ReplicatedWorstNetQualityBeyondLatency":
            case "TAGame.GameEvent_Soccar_TA:ReplicatedServerPerformanceState":
            case "TAGame.Ball_Haunted_TA:TotalActiveBeams":
            case "TAGame.Ball_Haunted_TA:DeactivatedGoalIndex":
            case "TAGame.Ball_Haunted_TA:ReplicatedBeamBrokenValue":
                asp.Data = br.ReadByte();
                break;

            case "TAGame.PRI_TA:SkillTier":
                asp.Data = br.ReadUInt32Max(500);     // 9 bits. I picked a value that works, but could just be 1 bit + 1 byte instead of a single value.
                break;

            case "Engine.Actor:Location":
            case "TAGame.CarComponent_Dodge_TA:DodgeTorque":
                asp.Data = Vector3D.Deserialize(br, netVersion);
                break;

            case "Engine.Actor:bCollideWorld":
            case "Engine.PlayerReplicationInfo:bReadyToPlay":
            case "TAGame.Vehicle_TA:bReplicatedHandbrake":
            case "TAGame.Vehicle_TA:bDriving":
            case "Engine.Actor:bNetOwner":
            case "Engine.Actor:bBlockActors":
            case "TAGame.GameEvent_TA:bHasLeaveMatchPenalty":
            case "TAGame.PRI_TA:bUsingBehindView":
            case "TAGame.PRI_TA:bUsingSecondaryCamera":     // Ball cam on when true
            case "TAGame.GameEvent_TA:ActivatorCar":
            case "TAGame.GameEvent_Soccar_TA:bOverTime":
            case "ProjectX.GRI_X:bGameStarted":
            case "Engine.Actor:bCollideActors":
            case "TAGame.PRI_TA:bReady":
            case "TAGame.RBActor_TA:bFrozen":
            case "Engine.Actor:bHidden":
            case "TAGame.CarComponent_FlipCar_TA:bFlipRight":
            case "Engine.PlayerReplicationInfo:bBot":
            case "Engine.PlayerReplicationInfo:bWaitingPlayer":
            case "TAGame.RBActor_TA:bReplayActor":
            case "TAGame.PRI_TA:bIsInSplitScreen":
            case "Engine.GameReplicationInfo:bMatchIsOver":
            case "TAGame.CarComponent_Boost_TA:bUnlimitedBoost":
            case "Engine.PlayerReplicationInfo:bIsSpectator":
            case "TAGame.GameEvent_Soccar_TA:bBallHasBeenHit":
            case "TAGame.CameraSettingsActor_TA:bUsingSecondaryCamera":
            case "TAGame.CameraSettingsActor_TA:bUsingBehindView":
            case "TAGame.PRI_TA:bOnlineLoadoutSet":
            case "TAGame.PRI_TA:bMatchMVP":
            case "TAGame.PRI_TA:bOnlineLoadoutsSet":
            case "TAGame.RBActor_TA:bIgnoreSyncing":
            case "TAGame.SpecialPickup_BallVelcro_TA:bHit":
            case "TAGame.GameEvent_TA:bCanVoteToForfeit":
            case "TAGame.SpecialPickup_BallVelcro_TA:bBroken":
            case "TAGame.GameEvent_Team_TA:bForfeit":
            case "TAGame.PRI_TA:bUsingItems":
            case "TAGame.VehiclePickup_TA:bNoPickup":
            case "TAGame.CarComponent_Boost_TA:bNoBoost":
            case "TAGame.PRI_TA:PlayerHistoryValid":
            case "TAGame.GameEvent_Soccar_TA:bUnlimitedTime":
            case "TAGame.GameEvent_Soccar_TA:bClubMatch":
            case "TAGame.GameEvent_Soccar_TA:bMatchEnded":
            case "TAGame.GameEvent_TA:bAllowReadyUp":
            case "Engine.Actor:bTearOff":
            case "Engine.PlayerReplicationInfo:bTimedOut":
            case "TAGame.CameraSettingsActor_TA:bMouseCameraToggleEnabled":
            case "TAGame.CameraSettingsActor_TA:bUsingSwivel":
            case "TAGame.Ball_Haunted_TA:bIsBallBeamed":
            case "TAGame.SpecialPickup_Rugby_TA:bBallWelded":
            case "TAGame.PRI_TA:bIsDistracted":
                asp.Data = br.ReadBit();
                break;

            case "TAGame.CarComponent_TA:ReplicatedActive":
                // The car component is active if (ReplicatedValue%2)!=0
                // For now I am only adding that logic to the JSON serializer
                asp.Data = br.ReadByte();
                break;

            case "Engine.PlayerReplicationInfo:UniqueId":
                asp.Data = UniqueId.Deserialize(br, licenseeVersion, netVersion);
                break;

            case "TAGame.PRI_TA:PartyLeader":
                asp.Data = PartyLeader.Deserialize(br, licenseeVersion, netVersion);
                break;

            case "TAGame.PRI_TA:ClientLoadout":
                asp.Data = ClientLoadout.Deserialize(br);
                break;

            case "TAGame.PRI_TA:CameraSettings":
            case "TAGame.CameraSettingsActor_TA:ProfileSettings":
                asp.Data = CameraSettings.Deserialize(br, engineVersion, licenseeVersion);
                break;

            case "TAGame.Car_TA:TeamPaint":
                asp.Data = TeamPaint.Deserialize(br);
                break;

            case "ProjectX.GRI_X:GameServerID":
                asp.Data = br.ReadBytes(8);
                break;

            case "ProjectX.GRI_X:Reservations":
                asp.Data = Reservation.Deserialize(engineVersion, licenseeVersion, netVersion, br);
                break;

            case "TAGame.Car_TA:ReplicatedDemolish":
                asp.Data = ReplicatedDemolish.Deserialize(br, netVersion);
                break;

            case "TAGame.GameEvent_Soccar_TA:ReplicatedMusicStinger":
                asp.Data = ReplicatedMusicStinger.Deserialize(br);
                break;

            case "TAGame.CarComponent_FlipCar_TA:FlipCarTime":
            case "TAGame.Ball_TA:ReplicatedBallScale":
            case "TAGame.CarComponent_Boost_TA:RechargeDelay":
            case "TAGame.CarComponent_Boost_TA:RechargeRate":
            case "TAGame.Ball_TA:ReplicatedAddedCarBounceScale":
            case "TAGame.Ball_TA:ReplicatedBallMaxLinearSpeedScale":
            case "TAGame.Ball_TA:ReplicatedWorldBounceScale":
            case "TAGame.CarComponent_Boost_TA:BoostModifier":
            case "Engine.Actor:DrawScale":
            case "TAGame.CrowdActor_TA:ModifiedNoise":
            case "TAGame.CarComponent_TA:ReplicatedActivityTime":
            case "TAGame.SpecialPickup_BallFreeze_TA:RepOrigSpeed":
            case "TAGame.SpecialPickup_BallVelcro_TA:AttachTime":
            case "TAGame.SpecialPickup_BallVelcro_TA:BreakTime":
            case "TAGame.Car_TA:AddedCarForceMultiplier":
            case "TAGame.Car_TA:AddedBallForceMultiplier":
            case "TAGame.PRI_TA:SteeringSensitivity":
            case "TAGame.Car_TA:ReplicatedCarScale":
            case "Engine.WorldInfo:WorldGravityZ":
            case "Engine.WorldInfo:TimeDilation":
            case "TAGame.Ball_God_TA:TargetSpeed":
                asp.Data = br.ReadFloat();
                break;

            case "TAGame.GameEvent_SoccarPrivate_TA:MatchSettings":
                asp.Data = PrivateMatchSettings.Deserialize(br);
                break;

            case "TAGame.PRI_TA:ClientLoadoutOnline":
                asp.Data = ClientLoadoutOnline.Deserialize(br, engineVersion, licenseeVersion, objectIndexToName);
                break;

            case "TAGame.GameEvent_TA:GameMode":
                if (engineVersion >= 868 && licenseeVersion >= 12)
                {
                    asp.Data = br.ReadByte();
                }
                else
                {
                    asp.Data = br.ReadUInt32Max(4);
                }
                break;

            case "TAGame.PRI_TA:ClientLoadoutsOnline":
                asp.Data = ClientLoadoutsOnline.Deserialize(br, engineVersion, licenseeVersion, objectIndexToName);
                break;

            case "TAGame.PRI_TA:ClientLoadouts":
                asp.Data = ClientLoadouts.Deserialize(br);
                break;

            case "TAGame.Team_TA:ClubColors":
            case "TAGame.Car_TA:ClubColors":
                asp.Data = ClubColors.Deserialize(br);
                break;

            case "TAGame.RBActor_TA:WeldedInfo":
                asp.Data = WeldedInfo.Deserialize(br, netVersion);
                break;

            case "TAGame.BreakOutActor_Platform_TA:DamageState":
                asp.Data = DamageState.Deserialize(br, netVersion);
                break;

            case "TAGame.Ball_Breakout_TA:AppliedDamage":
                asp.Data = AppliedDamage.Deserialize(br, netVersion);
                break;

            case "TAGame.Ball_TA:ReplicatedExplosionData":
                asp.Data = ReplicatedExplosionData.Deserialize(br, netVersion);
                break;

            case "TAGame.Ball_TA:ReplicatedExplosionDataExtended":
                asp.Data = ReplicatedExplosionDataExtended.Deserialize(br, netVersion);
                break;

            case "TAGame.PRI_TA:SecondaryTitle":
            case "TAGame.PRI_TA:PrimaryTitle":
                asp.Data = Title.Deserialize(br);
                break;

            case "TAGame.PRI_TA:PlayerHistoryKey":
                // Betting ReadUInt32Max is more likely, since 14 bits is a weird number
                asp.Data = br.ReadUInt32FromBits(14);
                break;

            case "TAGame.GameEvent_Soccar_TA:ReplicatedStatEvent":
                asp.Data = ReplicatedStatEvent.Deserialize(br);
                break;

            case "TAGame.Team_TA:ClubID":
            case "TAGame.PRI_TA:ClubID":
            case "TAGame.MaxTimeWarningData_TA:EndGameWarningEpochTime":
            case "TAGame.MaxTimeWarningData_TA:EndGameEpochTime":
                asp.Data = br.ReadUInt64();
                break;

            case "TAGame.PRI_TA:RepStatTitles":
                asp.Data = RepStatTitle.Deserialize(br);
                break;

            case "TAGame.VehiclePickup_TA:NewReplicatedPickupData":
                asp.Data = NewReplicatedPickupData.Deserialize(br);
                break;

            case "TAGame.Car_TA:ReplicatedDemolish_CustomFX":
                asp.Data = ReplicatedDemolishCustomFx.Deserialize(br, netVersion);
                break;

            default:
                throw new NotSupportedException(string.Format("Unknown property {0}. Next bits in the data are {1}. Figure it out!", asp.PropertyName, br.GetBits(br.Position, Math.Min(4096, br.Length - br.Position)).ToBinaryString()));
            }

            return(asp);
        }
Пример #38
0
 public static BlockMode Create(BitReader br)
 {
     return(new BlockMode(br.ReadBits <short>(11)));
 }
Пример #39
0
 public void ReadPackedIntTest()
 {
     // This version is bit compatible with FArchive::SerializeIntPacked, see CustomBinaryReader
     reader = new BitReader(new byte[] { 14 });
     Assert.Equal(7u, reader.ReadIntPacked());
 }
Пример #40
0
 public void ReadInt32Test()
 {
     reader = new BitReader(new byte[] { 10, 58, 0, 0 });
     Assert.Equal(14858, reader.ReadInt32());
 }
Пример #41
0
 public BitReaderTest()
 {
     expectedBits  = new bool[] { true, true, false, false, false, true, false, false };
     expectedBytes = new byte[] { 35, 47, 215 };
     reader        = new BitReader(expectedBytes);
 }
Пример #42
0
 public void ReadSerializedIntTest()
 {
     reader = new BitReader(new byte[] { 1 });
     Assert.Equal(1u, reader.ReadSerializedInt(3));
 }
Пример #43
0
 public byte[] Decode(byte[] data, int codeSize)
 {
     using (var br = new BitReader(data)) {
         return(Decode(br, codeSize));
     }
 }
Пример #44
0
        public VideoFrame NextFrame(GraphicsContext gfx)
        {
            using (var read = new BinaryReader(fobj, Encoding.UTF8, true))
            {
                if (palFrames[curFrame])
                {
                    for (short i = 0; i < 256; i++)
                    {
                        palette[i] = new Color(read.ReadByte(), read.ReadByte(), read.ReadByte());
                    }
                }
                var bread = new BitReader(read.ReadBytes(bitfieldSize));
                for (int y = 0; y < gridHeight; y++)
                {
                    for (int x = 0; x < gridHeight; x++)
                    {
                        byte opcode = bread.ReadBit();
                        opcode |= (byte)(bread.ReadBit() << 1);
                        switch ((OpCode)opcode)
                        {
                        case OpCode.AsIs:
                            break;

                        case OpCode.OneColour:
                            byte colour = read.ReadByte();
                            for (int gy = 0; gy < 4; gy++)
                            {
                                Util.Memset(imgData, y * 4 * gridWidth + x * 4 + gy * width, colour, 4);
                            }
                            break;

                        case OpCode.TwoColour:
                            byte[] colours = read.ReadBytes(2);
                            var    cbread  = new BitReader(read.ReadBytes(2));
                            for (int gy = 0; gy < 4; gy++)
                            {
                                for (int gx = 0; gx < 4; gx++)
                                {
                                    imgData[y * 4 * gridWidth + x * 4 + gy * width + gx] = colours[cbread.ReadBit()];
                                }
                            }
                            break;

                        case OpCode.Literal:
                            for (int gy = 0; gy < 4; gy++)
                            {
                                Array.Copy(read.ReadBytes(4), 0, imgData, y * 4 * gridWidth + x * 4 + gy * width, 4);
                            }
                            break;
                        }
                    }
                }

                bread = new BitReader(read.ReadBytes(read.ReadUInt16()));
                var audioData = new byte[read.ReadUInt16()];
                int c         = 0;
                if (!init)
                {
                    prevCode = k = audioData[0] = read.ReadByte();
                    init     = true;
                    c        = 1;
                }
                while (c < audioData.Length)
                {
                    int count = 0;
                    for (int i = 0; i < 32; i++)
                    {
                        if (((1 << i) & (soundLzwDict.Count - 1)) != 0)
                        {
                            count = i;
                        }
                    }
                    count++;
                    int currCode = 0;
                    for (int i = 0; i < count; i++)
                    {
                        currCode |= bread.ReadBit() << i;
                    }
                    byte[] pattern;
                    if (currCode == soundLzwDict.Count)
                    {
                        pattern = new byte[soundLzwDict[prevCode].Length + 1];
                        Array.Copy(soundLzwDict[prevCode], 0, pattern, 0, soundLzwDict[prevCode].Length);
                        pattern[soundLzwDict[prevCode].Length] = k;
                    }
                    else
                    {
                        pattern = soundLzwDict[currCode];
                    }
                    Array.Copy(pattern, 0, audioData, c, soundLzwDict[prevCode].Length);
                    k = pattern[0];
                    byte[] ncode = new byte[soundLzwDict[prevCode].Length + 1];
                    Array.Copy(soundLzwDict[prevCode], 0, pattern, 0, soundLzwDict[prevCode].Length);
                    pattern[soundLzwDict[prevCode].Length] = k;
                    soundLzwDict.Add(ncode);
                    prevCode = currCode;
                    c       += pattern.Length;
                }

                var data = new Color[imgData.Length];
                for (int i = 0; i < imgData.Length; i++)
                {
                    data[i] = palette[imgData[i]];
                }

                var ret = new VideoFrame();
                ret.picture = new Texture2D(gfx.Device, width, height);
                ret.picture.SetData(data);
                ret.sound = new RawSourceWaveStream(new MemoryStream(audioData), fmt);
                return(ret);
            }
        }
Пример #45
0
        public void FromBase64(string base64, bool createDummyObject = false)
        {
            NetworkConfig config = this;

            byte[] binary = Convert.FromBase64String(base64);
            using (BitReader reader = BitReader.Get(binary))
            {
                config.ProtocolVersion = reader.ReadUShort();
                config.Transport       = (DefaultTransport)reader.ReadBits(5);

                ushort channelCount = reader.ReadUShort();
                config.Channels.Clear();
                for (int i = 0; i < channelCount; i++)
                {
                    Channel channel = new Channel()
                    {
                        Name      = reader.ReadString(),
                        Encrypted = reader.ReadBool(),
                        Type      = (ChannelType)reader.ReadBits(5)
                    };
                    config.Channels.Add(channel);
                }

                ushort messageTypeCount = reader.ReadUShort();
                config.MessageTypes.Clear();
                for (int i = 0; i < messageTypeCount; i++)
                {
                    MessageType messageType = new MessageType()
                    {
                        Name        = reader.ReadString(),
                        Passthrough = reader.ReadBool()
                    };
                    config.MessageTypes.Add(messageType);
                }

                ushort sceneCount = reader.ReadUShort();
                config.RegisteredScenes.Clear();
                for (int i = 0; i < sceneCount; i++)
                {
                    config.RegisteredScenes.Add(reader.ReadString());
                }

                ushort networkedPrefabsCount = reader.ReadUShort();
                config.NetworkedPrefabs.Clear();
                GameObject root = createDummyObject ? new GameObject("MLAPI: Dummy prefabs") : null;
                for (int i = 0; i < networkedPrefabsCount; i++)
                {
                    bool       playerPrefab = reader.ReadBool();
                    string     prefabName   = reader.ReadString();
                    GameObject dummyPrefab  = createDummyObject ? new GameObject("REPLACEME: " + prefabName + "(Dummy prefab)", typeof(NetworkedObject)) : null;
                    if (dummyPrefab != null)
                    {
                        dummyPrefab.GetComponent <NetworkedObject>().NetworkedPrefabName = prefabName;
                        dummyPrefab.transform.SetParent(root.transform); //This is just here to not ruin your hierarchy
                    }
                    NetworkedPrefab networkedPrefab = new NetworkedPrefab()
                    {
                        playerPrefab = playerPrefab,
                        prefab       = dummyPrefab
                    };
                    config.NetworkedPrefabs.Add(networkedPrefab);
                }

                config.MessageBufferSize           = reader.ReadInt();
                config.ReceiveTickrate             = reader.ReadInt();
                config.MaxReceiveEventsPerTickRate = reader.ReadInt();
                config.SendTickrate   = reader.ReadInt();
                config.EventTickrate  = reader.ReadInt();
                config.MaxConnections = reader.ReadInt();
                config.ConnectPort    = reader.ReadInt();
                config.ConnectAddress = reader.ReadString();
                config.ClientConnectionBufferTimeout = reader.ReadInt();
                config.ConnectionApproval            = reader.ReadBool();
                config.SecondsHistory           = reader.ReadInt();
                config.HandleObjectSpawning     = reader.ReadBool();
                config.EnableEncryption         = reader.ReadBool();
                config.SignKeyExchange          = reader.ReadBool();
                config.AllowPassthroughMessages = reader.ReadBool();
                config.EnableSceneSwitching     = reader.ReadBool();
                config.EnableTimeResync         = reader.ReadBool();
                config.AttributeMessageMode     = (AttributeMessageMode)reader.ReadBits(3);
            }
        }
Пример #46
0
 public static void Read(this BitReader @this, IDeserializable serializable) => serializable.Deserialize(@this);
Пример #47
0
 public static T ReadGameObject <T>(this BitReader @this, Zone zone) where T : GameObject
 {
     return(@this.ReadGameObject(zone) as T);
 }
        /// <summary> Parses the Replay.Messages.Events file. </summary>
        /// <param name="buffer"> Buffer containing the contents of the replay.messages.events file. </param>
        /// <returns> A list of messages parsed from the buffer. </returns>
        public static void Parse(Replay replay, byte[] buffer)
        {
            if (buffer.Length <= 1)
            {
                // Chat has been removed from this replay
                return;
            }

            var ticksElapsed = 0;

            using (var stream = new MemoryStream(buffer))
            {
                var bitReader = new BitReader(stream);

                while (!bitReader.EndOfStream)
                {
                    var message = new Message();

                    ticksElapsed     += (int)bitReader.Read(6 + (bitReader.Read(2) << 3));
                    message.Timestamp = new TimeSpan(0, 0, (int)Math.Round(ticksElapsed / 16.0));

                    var playerIndex = (int)bitReader.Read(5);
                    if (playerIndex != 16)
                    {
                        message.MessageSender = replay.ClientListByUserID[playerIndex];
                        message.PlayerIndex   = playerIndex;
                    }

                    message.MessageEventType = (MessageEventType)bitReader.Read(4);
                    switch (message.MessageEventType)
                    {
                    case MessageEventType.SChatMessage:
                    {
                        var chatMessage = new ChatMessage
                        {
                            MessageTarget = (MessageTarget)bitReader.Read(3),                                 // m_recipient (the target)
                            Message       = Encoding.UTF8.GetString(bitReader.ReadBlobPrecededWithLength(11)) // m_string
                        };

                        message.ChatMessage = chatMessage;
                        replay.Messages.Add(message);
                        break;
                    }

                    case MessageEventType.SPingMessage:
                    {
                        var pingMessage = new PingMessage
                        {
                            MessageTarget = (MessageTarget)bitReader.Read(3),               // m_recipient (the target)
                            XCoordinate   = bitReader.ReadInt32() - (-2147483648),          // m_point x
                            YCoordinate   = bitReader.ReadInt32() - (-2147483648)           // m_point y
                        };

                        message.PingMessage = pingMessage;
                        replay.Messages.Add(message);
                        break;
                    }

                    case MessageEventType.SLoadingProgressMessage:
                    {
                        // can be used to keep track of how fast/slow players are loading
                        // also includes players who are reloading the game
                        var progress = bitReader.ReadInt32() - (-2147483648);         // m_progress
                        break;
                    }

                    case MessageEventType.SServerPingMessage:
                    {
                        break;
                    }

                    case MessageEventType.SReconnectNotifyMessage:
                    {
                        bitReader.Read(2);         // m_status; is either a 1 or a 2
                        break;
                    }

                    case MessageEventType.SPlayerAnnounceMessage:
                    {
                        var announceMessage = new PlayerAnnounceMessage {
                            AnnouncementType = (AnnouncementType)bitReader.Read(2)
                        };

                        switch (announceMessage.AnnouncementType)
                        {
                        case AnnouncementType.None:
                        {
                            break;
                        }

                        case AnnouncementType.Ability:
                        {
                            var ability = new AbilityAnnouncment {
                                AbilityLink  = bitReader.ReadInt16(),                  // m_abilLink
                                AbilityIndex = (int)bitReader.Read(5),                 // m_abilCmdIndex
                                ButtonLink   = bitReader.ReadInt16()                   // m_buttonLink
                            };

                            announceMessage.AbilityAnnouncement = ability;
                            break;
                        }

                        case AnnouncementType.Behavior:            // no idea what triggers this
                        {
                            bitReader.ReadInt16();                 // m_behaviorLink
                            bitReader.ReadInt16();                 // m_buttonLink
                            break;
                        }

                        case AnnouncementType.Vitals:
                        {
                            var vital = new VitalAnnouncment {
                                VitalType = (VitalType)(bitReader.ReadInt16() - (-32768))
                            };

                            announceMessage.VitalAnnouncement = vital;
                            break;
                        }

                        default:
                            throw new NotImplementedException();
                        }

                        if (replay.ReplayBuild > 45635)
                        {
                            // m_announceLink
                            bitReader.ReadInt16();
                        }

                        bitReader.ReadInt32();         // m_otherUnitTag
                        bitReader.ReadInt32();         // m_unitTag

                        message.PlayerAnnounceMessage = announceMessage;
                        replay.Messages.Add(message);
                        break;
                    }

                    default:
                        throw new NotImplementedException();
                    }

                    bitReader.AlignToByte();
                }
            }
        }
Пример #49
0
	public void Read ( BitReader reader ) { _indexPlusOne = reader.Packed<UInt32>(); }
Пример #50
0
        public static void Read(BitReader reader, Channel channel)
        {
            Array.Clear(channel.ScaleFactors, 0, channel.ScaleFactors.Length);

            channel.ScaleFactorCodingMode = reader.ReadInt(2);
            if (channel.ChannelIndex == 0)
            {
                switch (channel.ScaleFactorCodingMode)
                {
                case 0:
                    ReadVlcDeltaOffset(reader, channel);
                    break;

                case 1:
                    ReadClcOffset(reader, channel);
                    break;

                case 2:
                    if (channel.Block.FirstInSuperframe)
                    {
                        throw new InvalidDataException();
                    }
                    ReadVlcDistanceToBaseline(reader, channel, channel.ScaleFactorsPrev, channel.Block.QuantizationUnitsPrev);
                    break;

                case 3:
                    if (channel.Block.FirstInSuperframe)
                    {
                        throw new InvalidDataException();
                    }
                    ReadVlcDeltaOffsetWithBaseline(reader, channel, channel.ScaleFactorsPrev, channel.Block.QuantizationUnitsPrev);
                    break;
                }
            }
            else
            {
                switch (channel.ScaleFactorCodingMode)
                {
                case 0:
                    ReadVlcDeltaOffset(reader, channel);
                    break;

                case 1:
                    ReadVlcDistanceToBaseline(reader, channel, channel.Block.Channels[0].ScaleFactors, channel.Block.ExtensionUnit);
                    break;

                case 2:
                    ReadVlcDeltaOffsetWithBaseline(reader, channel, channel.Block.Channels[0].ScaleFactors, channel.Block.ExtensionUnit);
                    break;

                case 3:
                    if (channel.Block.FirstInSuperframe)
                    {
                        throw new InvalidDataException();
                    }
                    ReadVlcDistanceToBaseline(reader, channel, channel.ScaleFactorsPrev, channel.Block.QuantizationUnitsPrev);
                    break;
                }
            }

            for (int i = 0; i < channel.Block.ExtensionUnit; i++)
            {
                if (channel.ScaleFactors[i] < 0 || channel.ScaleFactors[i] > 31)
                {
                    throw new InvalidDataException("Scale factor values are out of range.");
                }
            }

            Array.Copy(channel.ScaleFactors, channel.ScaleFactorsPrev, channel.ScaleFactors.Length);
        }
Пример #51
0
 internal virtual void ReadCommonDataEnd(BitReader reader)
 {
 }
Пример #52
0
        public void Decode(Stream input, Stream output)
        {
            var inputStartPosition = input.Position;

            var buffer = new byte[4];

            input.Read(buffer, 0, 4);
            if (!buffer.SequenceEqual(new byte[] { 0x59, 0x61, 0x79, 0x30 }))
            {
                throw new InvalidCompressionException("Yay0" + (_byteOrder == ByteOrder.LittleEndian ? "LE" : "BE"));
            }

            input.Read(buffer, 0, 4);
            var uncompressedLength = _byteOrder == ByteOrder.LittleEndian ? buffer.GetInt32LittleEndian(0) : buffer.GetInt32BigEndian(0);

            input.Read(buffer, 0, 4);
            var compressedTableOffset = _byteOrder == ByteOrder.LittleEndian ? buffer.GetInt32LittleEndian(0) : buffer.GetInt32BigEndian(0);

            input.Read(buffer, 0, 4);
            var uncompressedTableOffset = _byteOrder == ByteOrder.LittleEndian ? buffer.GetInt32LittleEndian(0) : buffer.GetInt32BigEndian(0);

            _circularBuffer = new CircularBuffer(0x1000);
            //var windowBuffer = new byte[0x1000];
            //var windowBufferPosition = 0;
            var compressedTablePosition   = 0;
            var uncompressedTablePosition = 0;

            var bitLayout = new byte[compressedTableOffset - 0x10];

            input.Read(bitLayout, 0, bitLayout.Length);
            using (var bitReader = new BitReader(new MemoryStream(bitLayout), BitOrder.MsbFirst, 1, ByteOrder.BigEndian))
            {
                while (output.Length < uncompressedLength)
                {
                    if (bitReader.ReadBit() == 1)
                    {
                        // Flag for uncompressed byte
                        input.Position = inputStartPosition + uncompressedTableOffset + uncompressedTablePosition++;
                        var value = (byte)input.ReadByte();

                        output.WriteByte(value);
                        _circularBuffer.WriteByte(value);
                    }
                    else
                    {
                        // Flag for compressed data
                        input.Position = inputStartPosition + compressedTableOffset + compressedTablePosition;
                        var firstByte  = input.ReadByte();
                        var secondByte = input.ReadByte();
                        compressedTablePosition += 2;

                        var length = firstByte >> 4;
                        if (length > 0)
                        {
                            length += 2;
                        }
                        else
                        {
                            // Yes, we do read the length from the uncompressed data stream
                            input.Position = inputStartPosition + uncompressedTableOffset + uncompressedTablePosition++;
                            length         = input.ReadByte() + 0x12;
                        }
                        var displacement = (((firstByte & 0xF) << 8) | secondByte) + 1;

                        _circularBuffer.Copy(output, displacement, length);
                    }
                }
            }
        }
Пример #53
0
        private string Sanitize(Variant value)
        {
            string final = null;

            if (value.GetVariantType() == Variant.VariantType.ByteString)
            {
                try
                {
                    final = encoding.GetString((byte[])value);
                }
                catch (DecoderFallbackException)
                {
                    throw new PeachException("Error, " + debugName + " value contains invalid " + stringType + " bytes.");
                }
            }
            if (value.GetVariantType() == Variant.VariantType.BitStream)
            {
                try
                {
                    var rdr = new BitReader((BitwiseStream)value);
                    rdr.BaseStream.Seek(0, System.IO.SeekOrigin.Begin);
                    final = rdr.ReadString(encoding);
                }
                catch (DecoderFallbackException)
                {
                    throw new PeachException("Error, " + debugName + " value contains invalid " + stringType + " bytes.");
                }
            }
            else
            {
                try
                {
                    encoding.GetBytes((string)value);
                }
                catch
                {
                    throw new PeachException("Error, " + debugName + " value contains invalid " + stringType + " characters.");
                }

                final = (string)value;
            }

            if (_hasLength)
            {
                var lenType = lengthType;
                var len     = length;

                if (lenType == LengthType.Chars)
                {
                    if (NeedsExpand(final.Length, len, nullTerminated, final))
                    {
                        if (nullTerminated)
                        {
                            len -= 1;
                        }

                        final += MakePad((int)len - final.Length);
                    }
                }
                else
                {
                    if (lenType == LengthType.Bits)
                    {
                        if ((len % 8) != 0)
                        {
                            throw new PeachException("Error, " + debugName + " has invalid length of " + len + " bits.");
                        }

                        len     = len / 8;
                        lenType = LengthType.Bytes;
                    }

                    System.Diagnostics.Debug.Assert(lenType == LengthType.Bytes);

                    int actual = encoding.GetByteCount(final);

                    if (NeedsExpand(actual, len, nullTerminated, final))
                    {
                        int nullLen = encoding.GetByteCount("\0");
                        int padLen  = encoding.GetByteCount(new char[1] {
                            padCharacter
                        });

                        int grow = (int)len - actual;

                        if (nullTerminated)
                        {
                            grow -= nullLen;
                        }

                        if (grow < 0 || (grow % padLen) != 0)
                        {
                            throw new PeachException(string.Format("Error, can not satisfy length requirement of {1} {2} when padding {3} {0}.",
                                                                   debugName, lengthType == LengthType.Bits ? len * 8 : len, lengthType.ToString().ToLower(), stringType));
                        }

                        final += MakePad(grow / padLen);
                    }
                }
            }

            int test;

            if (int.TryParse(final, out test))
            {
                if (!Hints.ContainsKey("NumericalString"))
                {
                    Hints.Add("NumericalString", new Hint("NumericalString", "true"));
                }
            }
            else
            {
                if (Hints.ContainsKey("NumericalString"))
                {
                    Hints.Remove("NumericalString");
                }
            }

            return(final);
        }
Пример #54
0
        public static ActorStateProperty Deserialize(IClassNetCache classMap, IDictionary <int, string> objectIndexToName, BitReader br)
        {
            var asp = new ActorStateProperty();

            var maxPropId = classMap.MaxPropertyId;

            var className = objectIndexToName[classMap.ObjectIndex];

            asp.PropertyId    = br.ReadInt32Max(maxPropId + 1);
            asp.MaxPropertyId = maxPropId;
            asp.PropertyName  = objectIndexToName[classMap.GetProperty(asp.PropertyId).Index];

            var startPosition = br.Position;

            asp.Data = new List <object>();

            switch (asp.PropertyName)
            {
            case "TAGame.GameEvent_TA:ReplicatedStateIndex":
                asp.Data.Add(br.ReadInt32Max(140));     // number is made up, I dont know the max yet // TODO: Revisit this. It might work well enough, but looks fishy
                asp.IsComplete = true;
                break;

            case "TAGame.RBActor_TA:ReplicatedRBState":
                asp.Data.Add(RigidBodyState.Deserialize(br));
                asp.IsComplete = true;
                break;

            case "TAGame.Team_TA:GameEvent":
            case "TAGame.CrowdActor_TA:ReplicatedOneShotSound":
            case "TAGame.CrowdManager_TA:ReplicatedGlobalOneShotSound":
            case "Engine.Actor:Owner":
            case "Engine.GameReplicationInfo:GameClass":
            case "Engine.PlayerReplicationInfo:Team":
            case "TAGame.CrowdManager_TA:GameEvent":
            case "Engine.Pawn:PlayerReplicationInfo":     // Actor Id. Ties cars to players
            case "TAGame.PRI_TA:ReplicatedGameEvent":
            case "TAGame.Ball_TA:GameEvent":
            case "TAGame.CrowdActor_TA:GameEvent":
            case "TAGame.Team_TA:LogoData":
                asp.Data.Add(br.ReadBit());
                asp.Data.Add(br.ReadInt32());
                asp.IsComplete = true;
                break;

            case "TAGame.CarComponent_TA:Vehicle":
                asp.Data.Add(br.ReadBit());
                asp.Data.Add(br.ReadInt32());
                asp.IsComplete = true;
                break;

            case "Engine.GameReplicationInfo:ServerName":
            case "Engine.PlayerReplicationInfo:PlayerName":
            case "TAGame.Team_TA:CustomTeamName":
                asp.Data.Add(br.ReadString());
                asp.IsComplete = true;
                break;

            case "TAGame.GameEvent_Soccar_TA:SecondsRemaining":
            case "TAGame.GameEvent_TA:ReplicatedGameStateTimeRemaining":
            case "TAGame.CrowdActor_TA:ReplicatedCountDownNumber":
            case "TAGame.GameEvent_Team_TA:MaxTeamSize":
            case "Engine.PlayerReplicationInfo:PlayerID":
            case "TAGame.PRI_TA:TotalXP":
            case "TAGame.PRI_TA:MatchScore":
            case "TAGame.GameEvent_Soccar_TA:RoundNum":
            case "TAGame.GameEvent_TA:BotSkill":
            case "TAGame.PRI_TA:MatchShots":
            case "TAGame.PRI_TA:MatchSaves":
            case "ProjectX.GRI_X:ReplicatedGamePlaylist":
            case "Engine.TeamInfo:Score":
            case "Engine.PlayerReplicationInfo:Score":
            case "TAGame.PRI_TA:MatchGoals":
            case "TAGame.PRI_TA:MatchAssists":
            case "ProjectX.GRI_X:ReplicatedGameMutatorIndex":
            case "TAGame.PRI_TA:Title":
                asp.Data.Add(br.ReadInt32());
                asp.IsComplete = true;
                break;

            case "TAGame.VehiclePickup_TA:ReplicatedPickupData":
                // 1011101000000000000000000000000001
                // 0111111111111111111111111111111110
                // 1111001000000000000000000000000001
                // 1000001000000000000000000000000001
                // 1111110000000000000000000000000001
                // 1101110000000000000000000000000001

                // reverify the above data, especially the short stuff
                asp.Data.Add(br.ReadBit());
                asp.Data.Add(br.ReadInt32());
                asp.Data.Add(br.ReadBit());

                asp.IsComplete = true;
                break;

            case "Engine.PlayerReplicationInfo:Ping":
            case "TAGame.Vehicle_TA:ReplicatedSteer":
            case "TAGame.Vehicle_TA:ReplicatedThrottle":     // 0: full reverse, 128: No throttle.  255 full throttle/boosting
            case "TAGame.PRI_TA:CameraYaw":
            case "TAGame.PRI_TA:CameraPitch":
            case "TAGame.Ball_TA:HitTeamNum":
            case "TAGame.GameEvent_Soccar_TA:ReplicatedScoredOnTeam":
            case "TAGame.CarComponent_Boost_TA:ReplicatedBoostAmount":                     // Always 255?
                asp.Data.Add(br.ReadByte());
                asp.IsComplete = true;
                break;

            case "Engine.Actor:Location":
            case "TAGame.CarComponent_Dodge_TA:DodgeTorque":
                asp.Data.Add(Vector3D.Deserialize(br));
                asp.IsComplete = true;
                break;

            case "Engine.Actor:bCollideWorld":
            case "Engine.PlayerReplicationInfo:bReadyToPlay":
            case "TAGame.Vehicle_TA:bReplicatedHandbrake":
            case "TAGame.Vehicle_TA:bDriving":
            case "Engine.Actor:bNetOwner":
            case "Engine.Actor:bBlockActors":
            case "TAGame.GameEvent_TA:bHasLeaveMatchPenalty":
            case "TAGame.PRI_TA:bUsingBehindView":
            case "TAGame.PRI_TA:bUsingSecondaryCamera":
            case "TAGame.GameEvent_TA:ActivatorCar":
            case "TAGame.GameEvent_Soccar_TA:bOverTime":
            case "ProjectX.GRI_X:bGameStarted":
            case "Engine.Actor:bCollideActors":
            case "TAGame.PRI_TA:bReady":
            case "TAGame.RBActor_TA:bFrozen":
            case "Engine.Actor:bHidden":
            case "TAGame.CarComponent_FlipCar_TA:bFlipRight":
            case "Engine.PlayerReplicationInfo:bBot":
            case "Engine.PlayerReplicationInfo:bWaitingPlayer":
            case "TAGame.RBActor_TA:bReplayActor":
            case "TAGame.PRI_TA:bIsInSplitScreen":
            case "Engine.GameReplicationInfo:bMatchIsOver":
            case "TAGame.CarComponent_Boost_TA:bUnlimitedBoost":
            case "Engine.PlayerReplicationInfo:bIsSpectator":
            case "TAGame.GameEvent_Soccar_TA:bBallHasBeenHit":
                asp.Data.Add(br.ReadBit());
                asp.IsComplete = true;
                break;

            case "TAGame.CarComponent_TA:ReplicatedActive":
                // The car component is active if (ReplicatedValue%2)!=0
                // For now I am only adding that logic to the JSON serializer
                asp.Data.Add(br.ReadByte());

                asp.IsComplete = true;
                break;

            case "Engine.PlayerReplicationInfo:UniqueId":
            case "TAGame.PRI_TA:PartyLeader":
                asp.Data.Add(UniqueId.Deserialize(br));
                asp.IsComplete = true;
                break;

            case "TAGame.PRI_TA:ClientLoadout":
                asp.Data.Add(ClientLoadout.Deserialize(br));
                asp.IsComplete = true;
                break;

            case "TAGame.PRI_TA:CameraSettings":
                asp.Data.Add(CameraSettings.Deserialize(br));
                asp.IsComplete = true;
                break;

            case "TAGame.Car_TA:TeamPaint":
                asp.Data.Add(TeamPaint.Deserialize(br));
                asp.IsComplete = true;
                break;

            case "ProjectX.GRI_X:GameServerID":
                asp.Data.Add(br.ReadInt32());
                asp.Data.Add(br.ReadInt32());
                asp.IsComplete = true;
                break;

            case "ProjectX.GRI_X:Reservations":
                asp.Data.Add(Reservation.Deserialize(br));
                asp.IsComplete = true;
                break;

            case "TAGame.Ball_TA:ReplicatedExplosionData":
                // 0 01010111000000000000000000000000 0011 01010010000001 01111010001011 00000110000001
                // 0 01110111000000000000000000000000 0011 10011110010001 11111010001011 01010110000001
                // 0 11010111000000000000000000000000 0011 00001111011110 11000110001011 10111010000001
                // 0 11010111000000000000000000000000 0011 10011000100001 00100110001011 10111010000001
                // 0 00110111000000000000000000000000 0011 00000001010001 11000110001011 00100110000001
                asp.Data.Add(br.ReadBit());
                asp.Data.Add(br.ReadInt32());
                asp.Data.Add(Vector3D.Deserialize(br));     // Almost definitely position
                asp.IsComplete = true;
                break;

            case "TAGame.Car_TA:ReplicatedDemolish":
                asp.Data.Add(ReplicatedDemolish.Deserialize(br));
                asp.IsComplete = true;
                break;

            case "TAGame.GameEvent_Soccar_TA:ReplicatedMusicStinger":
                asp.Data.Add(br.ReadBit());
                asp.Data.Add(br.ReadByte());
                asp.Data.Add(br.ReadInt32());
                asp.IsComplete = true;
                break;

            case "TAGame.CarComponent_FlipCar_TA:FlipCarTime":
            case "TAGame.Ball_TA:ReplicatedBallScale":
            case "TAGame.CarComponent_Boost_TA:RechargeDelay":
            case "TAGame.CarComponent_Boost_TA:RechargeRate":
            case "TAGame.Ball_TA:ReplicatedAddedCarBounceScale":
            case "TAGame.Ball_TA:ReplicatedBallMaxLinearSpeedScale":
            case "TAGame.Ball_TA:ReplicatedWorldBounceScale":
            case "TAGame.CarComponent_Boost_TA:BoostModifier":
            case "Engine.Actor:DrawScale":
            case "TAGame.CrowdActor_TA:ModifiedNoise":
                asp.Data.Add(br.ReadFloat());
                asp.IsComplete = true;
                break;

            case "TAGame.GameEvent_SoccarPrivate_TA:MatchSettings":
                asp.Data.Add(PrivateMatchSettings.Deserialize(br));
                asp.IsComplete = true;
                break;

            case "TAGame.PRI_TA:ClientLoadoutOnline":
                asp.Data.Add(br.ReadInt32());
                asp.Data.Add(br.ReadInt32());
                asp.Data.Add(br.ReadInt32());
                asp.IsComplete = true;
                break;

            default:
                throw new NotSupportedException(string.Format("Unknown property {0}. Next bits in the data are {1}. Figure it out!", asp.PropertyName, br.GetBits(br.Position, Math.Min(4096, br.Length - br.Position)).ToBinaryString()));
            }

            asp.KnownDataBits = br.GetBits(startPosition, br.Position - startPosition);

            return(asp);
        }
Пример #55
0
        public PictureParameterSet(ReadOnlySpan <byte> span)
        {
            BitReader reader = new BitReader(span);

            // 7.3.2.3.1 General picture parameter set RBSP syntax, page 38
            pps_pic_parameter_set_id = reader.unsignedGolomb();
            pps_seq_parameter_set_id = reader.unsignedGolomb();
            dependent_slice_segments_enabled_flag = reader.readBit();
            output_flag_present_flag      = reader.readBit();
            num_extra_slice_header_bits   = reader.readByte(3);
            sign_data_hiding_enabled_flag = reader.readBit();
            cabac_init_present_flag       = reader.readBit();
            num_ref_idx_l0_default_active = reader.unsignedGolomb() + 1;
            num_ref_idx_l1_default_active = reader.unsignedGolomb() + 1;
            init_qp = reader.signedGolomb() + 26;

            constrained_intra_pred_flag = reader.readBit();
            transform_skip_enabled_flag = reader.readBit();
            cu_qp_delta_enabled_flag    = reader.readBit();
            if (cu_qp_delta_enabled_flag)
            {
                diff_cu_qp_delta_depth = reader.unsignedGolomb();
            }
            else
            {
                diff_cu_qp_delta_depth = 0;                 // When not present, the value of diff_cu_qp_delta_depth is inferred to be equal to 0.
            }
            pps_cb_qp_offset = reader.signedGolomb();
            pps_cr_qp_offset = reader.signedGolomb();
            pps_slice_chroma_qp_offsets_present_flag = reader.readBit();
            weighted_pred_flag               = reader.readBit();
            weighted_bipred_flag             = reader.readBit();
            transquant_bypass_enabled_flag   = reader.readBit();
            tiles_enabled_flag               = reader.readBit();
            entropy_coding_sync_enabled_flag = reader.readBit();

            num_tile_columns = num_tile_rows = 0;
            column_width     = row_height = null;
            loop_filter_across_tiles_enabled_flag = false;
            if (tiles_enabled_flag)
            {
                num_tile_columns = reader.unsignedGolomb() + 1;
                num_tile_rows    = reader.unsignedGolomb() + 1;
                bool uniform_spacing_flag = reader.readBit();
                if (!uniform_spacing_flag)
                {
                    column_width = new uint[num_tile_columns - 1];
                    for (uint i = 0; i < num_tile_columns - 1; i++)
                    {
                        column_width[i] = reader.unsignedGolomb();
                    }

                    row_height = new uint[num_tile_rows - 1];
                    for (uint i = 0; i < num_tile_rows - 1; i++)
                    {
                        row_height[i] = reader.unsignedGolomb();
                    }
                }
                loop_filter_across_tiles_enabled_flag = reader.readBit();
            }

            pps_loop_filter_across_slices_enabled_flag = reader.readBit();
            deblocking_filter_control_present_flag     = reader.readBit();
            deblocking_filter_override_enabled_flag    = false;
            pps_deblocking_filter_disabled_flag        = false;
            pps_beta_offset_div2 = pps_tc_offset_div2 = 0;
            if (deblocking_filter_control_present_flag)
            {
                deblocking_filter_override_enabled_flag = reader.readBit();
                pps_deblocking_filter_disabled_flag     = reader.readBit();
                if (!pps_deblocking_filter_disabled_flag)
                {
                    pps_beta_offset_div2 = reader.signedGolomb();
                    pps_tc_offset_div2   = reader.signedGolomb();
                }
            }

            pps_scaling_list_data_present_flag = reader.readBit();
            if (pps_scaling_list_data_present_flag)
            {
                scalingList = new ScalingList();
                scalingList.read(ref reader);
            }
            else
            {
                scalingList = null;
            }
        }
Пример #56
0
 internal static object ReadFieldType(BitReader reader, Type type)
 {
     return(ReadFieldType(reader, type, null));
 }
Пример #57
0
        /// <summary>
        /// Decode LZW stream in GIF, probably copied from somewhere else but I can't remember. If you believe that I copied your code, contact me and I'll credit you.
        /// </summary>
        public byte[] Decode(BitReader br, int codeSize)
        {
            using (var ms = new MemoryStream())
                using (var bw = new BitWriter(ms)) {
                    var dict = new Tuple <int, int> [LzwMaxCode + 1];
                    for (var i = 0; i < (1 << codeSize); ++i)
                    {
                        dict[i] = new Tuple <int, int>(LzwMaxCode + 1, i);
                    }

                    var initCodeSize = codeSize;
                    var clearCode    = 1 << codeSize;
                    var eofCode      = clearCode + 1;

                    var prevCode    = 0;
                    var currDictIdx = 0;
                    var currDictMax = 0;

                    ++codeSize;
                    while (true)
                    {
                        var code = br.ReadBits(codeSize);
                        if (code == clearCode)
                        {
                            codeSize    = initCodeSize;
                            currDictIdx = clearCode + 2;

                            ++codeSize;
                            currDictMax = (1 << codeSize);

                            prevCode = br.ReadBits(codeSize);
                            if (prevCode >= (1 << initCodeSize))
                            {
                                throw new GifDecodingException("no literal after clear");
                            }
                            bw.WriteBits(prevCode, GifByteSize);
                        }
                        else if (code == eofCode)
                        {
                            break;
                        }
                        else
                        {
                            if (code > currDictIdx)
                            {
                                throw new GifDecodingException("code > currDictIdx");
                            }

                            int newItem;
                            if (code < currDictIdx)
                            {
                                newItem = WriteDictString(bw, GifByteSize, dict, code);
                            }
                            else
                            {
                                newItem = WriteDictString(bw, GifByteSize, dict, prevCode);
                                bw.WriteBits(newItem, GifByteSize);
                            }

                            if (currDictIdx < currDictMax)
                            {
                                dict[currDictIdx++] = new Tuple <int, int>(prevCode, newItem);
                            }

                            prevCode = code;
                        }

                        if (currDictIdx == currDictMax)
                        {
                            if (currDictMax < LzwMaxCode)
                            {
                                ++codeSize;
                                currDictMax = (1 << codeSize);
                            }
                        }
                    }

                    bw.Flush();
                    return(ms.GetBuffer());
                }
        }
Пример #58
0
        static /*async Task*/ void Main()
        {
            var         splitted = "10 20 83 45 E1 79 04 0C FE 5C 60 64 D9 88 1A 4F B8 DA 05 9A 0D BF 97 07 40 1C 20 DB CA A6 A2 06 01 90 74 97 1A 01 20 F6 6A B6 76 80 E0 8E 80 40 0D 01 17 18 59 36 A2 C6 13 AE 76 81 5A C3 EF E5 01 30 00 00 00 00 00 00 00 00 A0 D7 10 B2 10 7B 35 5B FB 74 17 00 10 26 01 22 60 3A 6C 02 F0 40 30 02".Split(' ');
            List <byte> byteList = new List <byte>();

            foreach (string hex in splitted)
            {
                byte value = Convert.ToByte(hex, 16);
                byteList.Add(value);
            }
            var byteArray = byteList.ToArray();
            var reader    = new BitReader(byteArray);

            for (int i = 0; i < byteArray.Length * 8; i++)
            {
                var bytesIJustRead = reader.ReadBytesAt(i, 4);
                Console.WriteLine(BitConverter.ToString(bytesIJustRead) + "int:" + BitConverter.ToUInt32(bytesIJustRead));
            }


            //12

            //            using( var excelPackage = new ExcelPackage() )
            //            {
            //                ExcelWorksheet replayWorksheet = excelPackage.Workbook.Worksheets.Add( "replayName" );
            //                ExcelWorksheet replayData = excelPackage.Workbook.Worksheets.Add( "replayData" );
            //                ExcelWorksheet checkpoint = excelPackage.Workbook.Worksheets.Add( "checkpoint" );
            //                DataDumper replayHeaderDumper = new DataDumper( replayWorksheet );
            //                DataDumper replayDataDumper = new DataDumper( replayData );
            //                DataDumper checkpointDumper = new DataDumper( checkpoint );
            //                foreach( var path in new ReplayFetcher().GetAllReplaysPath() )
            //                {

            //                    if(!path.Contains("Unsaved") || !path.Contains( "03.28" ) )
            //                    {
            //                        continue;
            //                    }
            //                    replayHeaderDumper.DumpValue( Path.GetFileNameWithoutExtension( path ) );
            //                    using( var replayStream = File.OpenRead( path ) )
            //                    using( var fortniteDataGrabber = new FortniteDataGrabber( replayStream ) )
            //                    {
            //                        bool success =await fortniteDataGrabber.Visit();
            //                        if( fortniteDataGrabber.ReplayInfo == null || fortniteDataGrabber.ReplayInfo.ReplayHeader == null )
            //                        {
            //                            replayHeaderDumper.DumpValue( "ReplayInfo is NULL." );
            //                            replayHeaderDumper.ReturnToNewRow();
            //                            continue;
            //                        }
            //                        ReplayInfo info = fortniteDataGrabber.ReplayInfo;
            //                        replayHeaderDumper.DumpValue( info.ReplayHeader.Compressed );
            //                        replayHeaderDumper.DumpValue( info.ReplayHeader.IsLive );
            //                        replayHeaderDumper.DumpValue( info.ReplayHeader.Changelist );
            //                        replayHeaderDumper.DumpValue( info.ReplayHeader.FileVersion );
            //                        replayHeaderDumper.DumpValue( info.ReplayHeader.FriendlyName );
            //                        replayHeaderDumper.DumpValue( info.ReplayHeader.LengthInMs );
            //                        replayHeaderDumper.DumpValue( info.ReplayHeader.NetworkVersion );
            //                        replayHeaderDumper.DumpValue( info.ReplayHeader.Timestamp );
            //                        replayHeaderDumper.DumpValue( info.ReplayHeader.TotalDataSizeInBytes );

            //                        if( fortniteDataGrabber.ReplayInfo.DemoHeader == null )
            //                        {
            //                            replayHeaderDumper.DumpValue( "Header chunk is NULL." );
            //                            replayHeaderDumper.ReturnToNewRow();
            //                            continue;
            //                        }

            //                        DemoHeader headerChunk = fortniteDataGrabber.ReplayInfo.DemoHeader;
            //                        replayHeaderDumper.DumpValue( headerChunk.Version );
            //                        replayHeaderDumper.DumpValue( headerChunk.Branch );
            //                        replayHeaderDumper.DumpValue( headerChunk.HeaderFlags );
            //                        replayHeaderDumper.DumpValue( headerChunk.Major + "." + headerChunk.Minor+ "." + headerChunk.Patch );
            //                        replayHeaderDumper.DumpValue( string.Join( "/", headerChunk.GameSpecificData ) );
            //                        replayHeaderDumper.DumpValue( fortniteDataGrabber.Error );
            //                        //string test ="";
            //                        //if(headerChunk.GuidLike.Length>0)
            //                        //{
            //                        //     test = new Guid( headerChunk.GuidLike ).ToString();
            //                        //}
            //                        //replayHeaderDumper.DumpValue( test );
            //                        //replayHeaderDumper.DumpValue( headerChunk.HeaderVersion );
            //                        //replayHeaderDumper.DumpValue( headerChunk.NotSeasonNumber );
            //                        //replayHeaderDumper.DumpValue( headerChunk.NotVersion );
            //                        //foreach( byte[] replayDataDump in fortniteDataGrabber.ReplayDataDumps )
            //                        //{
            //                        //    replayDataDumper.DumpValue(replayHeaderDumper.Row);
            //                        //    replayDataDumper.DumpValue(BitConverter.ToString(replayDataDump));
            //                        //    replayDataDumper.ReturnToNewRow();
            //                        //    replayDataDumper.DumpValue( replayHeaderDumper.Row );
            //                        //    replayDataDumper.DumpValue( Encoding.ASCII.GetString( replayDataDump ) );
            //                        //    replayDataDumper.ReturnToNewRow();
            //                        //}
            //                        int ij = 0;
            //                        foreach( byte[] checkpointDump in fortniteDataGrabber.CheckpointsDumps )
            //                        {
            //                            checkpointDumper.DumpValue( replayHeaderDumper.Row );
            //                            checkpointDumper.DumpValue( BitConverter.ToString( checkpointDump ) );
            //                            checkpointDumper.ReturnToNewRow();
            //                            checkpointDumper.DumpValue( replayHeaderDumper.Row );
            //                            checkpointDumper.DumpValue( Encoding.ASCII.GetString( checkpointDump ) );
            //                            checkpointDumper.ReturnToNewRow();
            //                            using( var stream = File.OpenWrite( ij++ + ".dump" ) )
            //                            {
            //                                stream.Write( checkpointDump, 0, checkpointDump.Length );
            //                            }
            //                        }


            //                        Console.WriteLine( "Processed: " + Path.GetFileNameWithoutExtension( path ) );
            //                        replayHeaderDumper.ReturnToNewRow();
            //                    }
            //                }
            //                excelPackage.SaveAs( new FileInfo( "ExcelExport.xlsx" ) );
            //            }
            //        }
            //    }

            //    class DataDumper
            //    {
            //        readonly ExcelWorksheet _excelWorksheet;
            //        int _rowNumber;
            //        int _colNumber;
            //        public int Row { get => _rowNumber; }
            //        public DataDumper( ExcelWorksheet excelWorksheet )
            //        {
            //            _rowNumber = 1;
            //            _colNumber = 1;
            //            _excelWorksheet = excelWorksheet;
            //        }

            //        public void DumpValue( object dataToDump )
            //        {
            //            _excelWorksheet.SetValue( _rowNumber, _colNumber, dataToDump );
            //            _colNumber++;
            //        }

            //        public int ReturnToNewRow()
            //        {
            //            _colNumber = 1;
            //            _rowNumber++;
            //            return _rowNumber;
            //        }



            ////        byte[] toCompress = Encoding.ASCII.GetBytes( "testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest" );
            ////                foreach(var compression in (IEnumerable<OodleBinding.OodleFormat>) Enum.GetValues( typeof(OodleBinding.OodleFormat ) ) )
            ////                {
            ////                    using(Stream file = File.OpenWrite( "dumpcompress." + compression.ToString() ) )
            ////                    {
            ////                        byte[] result = OodleBinding.Compress( toCompress, toCompress.Length, compression, OodleBinding.OodleCompressionLevel.VeryFast );
            ////        file.Write(result );
            ////                        //file.Write( replayDataDump );
            ////                    }
        }
Пример #59
0
        public static void skip(ref BitReader reader, bool profilePresentFlag, int maxNumSubLayers)
        {
            // 7.3.3 Profile, tier and level syntax, page 42
            if (profilePresentFlag)
            {
                byte general_profile_space = reader.readByte(2);
                bool general_tier_flag     = reader.readBit();
                byte general_profile_idc   = reader.readByte(5);
                uint general_profile_compatibility_flag = unchecked ((uint)reader.readInt(32));
                bool general_progressive_source_flag    = reader.readBit();
                bool general_interlaced_source_flag     = reader.readBit();
                bool general_non_packed_constraint_flag = reader.readBit();
                bool general_frame_only_constraint_flag = reader.readBit();

                // Lots of stuff, depends on levels
                reader.skipBits(43);

                reader.skipBits(1);                     // general_reserved_zero_bit or general_inbld_flag
            }

            byte general_level_idc = reader.readByte(8);

            Span <eSubLayerFlags> subFlags = stackalloc eSubLayerFlags[maxNumSubLayers - 1];

            for (int i = 0; i < maxNumSubLayers - 1; i++)
            {
                eSubLayerFlags flags = eSubLayerFlags.None;
                if (reader.readBit())
                {
                    flags |= eSubLayerFlags.ProfilePresent;
                }
                if (reader.readBit())
                {
                    flags |= eSubLayerFlags.LevelPresent;
                }
                subFlags[i] = flags;
            }
            if (maxNumSubLayers > 1)
            {
                for (int i = maxNumSubLayers - 1; i < 8; i++)
                {
                    reader.skipBits(2);                         // reserved_zero_2bits
                }
            }
            for (int i = 0; i < maxNumSubLayers - 1; i++)
            {
                if (subFlags[i].HasFlag(eSubLayerFlags.ProfilePresent))
                {
                    reader.skipBits(8);                        // sub_layer_profile_space, sub_layer_tier_flag[ i ], sub_layer_profile_idc[ i ]
                    reader.skipBits(32);                       // sub_layer_profile_compatibility_flag[ i ][ j ]
                    reader.skipBits(4);                        // sub_layer_progressive_source_flag[ i ], sub_layer_interlaced_source_flag[ i ], sub_layer_non_packed_constraint_flag[ i ], sub_layer_frame_only_constraint_flag[ i ]

                    // Lots of stuff
                    reader.skipBits(43);

                    reader.skipBits(1);                         // sub_layer_inbld_flag[ i ] or sub_layer_reserved_zero_bit[ i ]
                }
                if (subFlags[i].HasFlag(eSubLayerFlags.LevelPresent))
                {
                    reader.skipBits(8);
                }
            }
        }
Пример #60
0
        public static Frame Deserialize(int maxChannels, ref List <ActorState> existingActorStates, string[] objectIdToName, IEnumerable <ClassNetCache> classNetCache, BitReader br)
        {
            var f = new Frame();

            f.Position = br.Position;

            f.Time  = br.ReadFloat();
            f.Delta = br.ReadFloat();

            f.ActorStates = new List <ActorState>();

            ActorState lastActorState = null;

            while (br.ReadBit())
            {
                lastActorState = ActorState.Deserialize(maxChannels, existingActorStates, f.ActorStates, objectIdToName, classNetCache, br);

                var existingActor = existingActorStates.Where(x => x.Id == lastActorState.Id).SingleOrDefault();
                if (lastActorState.State != ActorStateState.Deleted)
                {
                    if (existingActor == null)
                    {
                        existingActorStates.Add(lastActorState);
                    }
                }
                else
                {
                    existingActorStates = existingActorStates.Where(x => x.Id != lastActorState.Id).ToList();
                }

                f.ActorStates.Add(lastActorState);

#if DEBUG
                if (!lastActorState.Complete)
                {
                    break;
                }
#endif
            }
#if DEBUG
            if (lastActorState == null || lastActorState.Complete)
            {
                f.Complete = true;
            }

            if (lastActorState != null && lastActorState.Failed)
            {
                f.Failed = true;
            }

            f.RawData = br.GetBits(f.Position, br.Position - f.Position).ToArray();
#endif
            return(f);
        }