Ejemplo n.º 1
0
        private static object Deserialize(Starcraft2SerializedDataType type, BinaryReader reader, bool convertStringsToUtf8)
        {
            switch (type)
            {
                case Starcraft2SerializedDataType.SingleByteInteger:
                    return (int)reader.ReadByte();
                case Starcraft2SerializedDataType.FourByteInteger:
                    return reader.ReadInt32();
                case Starcraft2SerializedDataType.VariableLengthInteger:
                    return DeserializeVariableLengthInteger(reader);
                case Starcraft2SerializedDataType.BinaryString:
                    {
                        var length = DeserializeVariableLengthInteger(reader);
                        var bytes = reader.ReadBytes((int)length);

                        if (convertStringsToUtf8)
                            return Encoding.UTF8.GetString(bytes);

                        return bytes;
                    }
                case Starcraft2SerializedDataType.Array:
                    {
                        var flag = reader.ReadByte();

                        // first observed in SC2 Patch 1.5:
                        //	if the first byte following the array is 0, then the array is empty
                        if (flag == 0)
                            return new object[0];

                        // first observed in HOTS Patch 2.0:
                        //  the byte immediately following the flag appears to be
                        //  an data type indicator - If it's not null, then we
                        //  assume the array has a length of 1 and parse the single
                        //  value according to the data type in this byte.
                        var singleElementType = reader.ReadByte();

                        if (singleElementType != 0)
                        {
                            return new [] { Deserialize((Starcraft2SerializedDataType)singleElementType, reader, convertStringsToUtf8) };
                        }
                        else
                        {
                            var length = DeserializeVariableLengthInteger(reader);
                            var array = new object[length];

                            for (var i = 0; i < length; i++)
                                array[i] = Deserialize(reader, convertStringsToUtf8);

                            return array;
                        }

                    }
                case Starcraft2SerializedDataType.Map:
                    {
                        var length = DeserializeVariableLengthInteger(reader);
                        var dict = new Dictionary<long, object>();

                        for (var i = 0; i < length; i++)
                        {
                            var key = DeserializeVariableLengthInteger(reader);
                            var value = Deserialize(reader, convertStringsToUtf8);
                            dict[key] = value;
                        }

                        return dict;
                    }
                default:
                    throw new MpqParsingException(
                        string.Format("Serialized data with type flag '{0}' is not supported.", (byte)type));
            }
        }
Ejemplo n.º 2
0
        private static object Deserialize(Starcraft2SerializedDataType type, BinaryReader reader, bool convertStringsToUtf8)
        {
            switch (type)
            {
            case Starcraft2SerializedDataType.SingleByteInteger:
                return((int)reader.ReadByte());

            case Starcraft2SerializedDataType.FourByteInteger:
                return(reader.ReadInt32());

            case Starcraft2SerializedDataType.VariableLengthInteger:
                return(DeserializeVariableLengthInteger(reader));

            case Starcraft2SerializedDataType.BinaryString:
            {
                var length = DeserializeVariableLengthInteger(reader);
                var bytes  = reader.ReadBytes((int)length);

                if (convertStringsToUtf8)
                {
                    return(Encoding.UTF8.GetString(bytes));
                }

                return(bytes);
            }

            case Starcraft2SerializedDataType.Array:
            {
                var flag = reader.ReadByte();

                // first observed in SC2 Patch 1.5:
                //	if the first byte following the array is 0, then the array is empty
                if (flag == 0)
                {
                    return(new object[0]);
                }

                // first observed in HOTS Patch 2.0:
                //  the byte immediately following the flag appears to be
                //  an data type indicator - If it's not null, then we
                //  assume the array has a length of 1 and parse the single
                //  value according to the data type in this byte.
                var singleElementType = reader.ReadByte();

                if (singleElementType != 0)
                {
                    return(new [] { Deserialize((Starcraft2SerializedDataType)singleElementType, reader, convertStringsToUtf8) });
                }
                else
                {
                    var length = DeserializeVariableLengthInteger(reader);
                    var array  = new object[length];

                    for (var i = 0; i < length; i++)
                    {
                        array[i] = Deserialize(reader, convertStringsToUtf8);
                    }

                    return(array);
                }
            }

            case Starcraft2SerializedDataType.Map:
            {
                var length = DeserializeVariableLengthInteger(reader);
                var dict   = new Dictionary <long, object>();

                for (var i = 0; i < length; i++)
                {
                    var key   = DeserializeVariableLengthInteger(reader);
                    var value = Deserialize(reader, convertStringsToUtf8);
                    dict[key] = value;
                }

                return(dict);
            }

            default:
                throw new MpqParsingException(
                          string.Format("Serialized data with type flag '{0}' is not supported.", (byte)type));
            }
        }