diff --git a/YamlDotNet.Test/Serialization/SerializationTests.cs b/YamlDotNet.Test/Serialization/SerializationTests.cs index 0d619904a..d30c5968e 100644 --- a/YamlDotNet.Test/Serialization/SerializationTests.cs +++ b/YamlDotNet.Test/Serialization/SerializationTests.cs @@ -164,6 +164,36 @@ public void DeserializeScalarLongBase60Number() result.Should().Be(77744246530L); } + [Theory] + [InlineData("0o0", 0)] + [InlineData("0x8000", 32768)] + [InlineData("0xFFFFFFFFFFFFFFFF", 18_446_744_073_709_551_615)] + public void DeserializeScalarBase16FromUnknown(string yaml, ulong value) + { + IDeserializer deserializer = new DeserializerBuilder() + .WithAttemptingUnquotedStringTypeDeserialization() + .Build(); + + var result = deserializer.Deserialize(new StringReader(yaml)); + + result.Should().Be(value); + } + + [Theory] + [InlineData("0o0", 0)] + [InlineData("0o100000", 32768)] + [InlineData("0o1777777777777777777777", 18_446_744_073_709_551_615)] + public void DeserializeScalarBase8FromUnknown(string yaml, ulong value) + { + IDeserializer deserializer = new DeserializerBuilder() + .WithAttemptingUnquotedStringTypeDeserialization() + .Build(); + + var result = deserializer.Deserialize(new StringReader(yaml)); + + result.Should().Be(value); + } + [Theory] [InlineData(EnumExample.One)] [InlineData(EnumExample.One | EnumExample.Two)] diff --git a/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs b/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs index 175376ee0..47a2d2f5a 100644 --- a/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs +++ b/YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs @@ -355,24 +355,16 @@ private static object CastInteger(ulong number, TypeCode typeCode) default: if (Regex.IsMatch(v, "0x[0-9a-fA-F]+")) //base16 number { - if (TryAndSwallow(() => Convert.ToByte(v, 16), out result)) { } - else if (TryAndSwallow(() => Convert.ToInt16(v, 16), out result)) { } - else if (TryAndSwallow(() => Convert.ToInt32(v, 16), out result)) { } - else if (TryAndSwallow(() => Convert.ToInt64(v, 16), out result)) { } - else if (TryAndSwallow(() => Convert.ToUInt64(v, 16), out result)) { } + if (TryAndSwallow(() => Convert.ToUInt64(v, 16), out result)) { } else { //we couldn't parse it, default to a string. It's probably to big. result = v; } } - else if (Regex.IsMatch(v, "0o[0-9a-fA-F]+")) //base8 number + else if (Regex.IsMatch(v, "0o[0-7]+")) //base8 number { - if (TryAndSwallow(() => Convert.ToByte(v, 8), out result)) { } - else if (TryAndSwallow(() => Convert.ToInt16(v, 8), out result)) { } - else if (TryAndSwallow(() => Convert.ToInt32(v, 8), out result)) { } - else if (TryAndSwallow(() => Convert.ToInt64(v, 8), out result)) { } - else if (TryAndSwallow(() => Convert.ToUInt64(v, 8), out result)) { } + if (TryAndSwallow(() => Convert.ToUInt64(v.Substring(2), 8), out result)) { } else { //we couldn't parse it, default to a string. It's probably to big.