public string GetString(int subType, IStringReader stringReader) { string value; switch (Type) { // Integer case 1: value = $"{Value}"; break; // Unsigned Integer case 2: if (subType == 0x14 || subType == 0x1E || subType == 0x1F || subType == 0x21) { var foundString = stringReader.GetByHash((uint)Value); if (foundString == null) { value = $"{Value}"; break; } value = $"\"{foundString}\""; break; } value = $"{Value}"; break; // Float case 3: value = $"{BitConverter.Int32BitsToSingle((int)Value).ToString(CultureInfo.GetCultureInfo("en-gb"))}"; break; // Execution Context values case 4: // 4000+ ? // Values 3000+ are input parameters to the method // 2000+ ? // Values 1000+ are stack values value = "$"; if (Value >= 1000 && Value <= 1999) { value += $"v{Value - 1000}"; } if (Value >= 2000 && Value <= 2999) { value += $"x{Value - 2000}"; } if (Value >= 3000 && Value <= 3999) { value += $"p{Value - 3000}"; } if (Value >= 4000 && Value <= 4999) { value += $"y{Value - 4000}"; } break; // String case 24: value = $"\"{stringReader.Read(Value)}\""; break; // Method Name case 25: value = $"\"{stringReader.Read(Value)}\""; break; default: throw new InvalidOperationException($"Unknown type {Type}."); } return(value + $"<{Type}>"); }