Skip to content

Commit 6221f4e

Browse files
author
Mirroring
committed
Merge commit '9da8c6a4a6ea03054e776275d3fd5c752897842e'
2 parents 32d8ea6 + 9da8c6a commit 6221f4e

File tree

2 files changed

+77
-4
lines changed

2 files changed

+77
-4
lines changed

src/libraries/System.Private.CoreLib/src/System/Convert.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -3099,7 +3099,7 @@ public static bool TryToHexString(ReadOnlySpan<byte> source, Span<char> destinat
30993099
charsWritten = 0;
31003100
return true;
31013101
}
3102-
else if (source.Length > int.MaxValue / 2 || destination.Length > source.Length * 2)
3102+
else if (source.Length > int.MaxValue / 2 || destination.Length < source.Length * 2)
31033103
{
31043104
charsWritten = 0;
31053105
return false;
@@ -3176,7 +3176,7 @@ public static bool TryToHexStringLower(ReadOnlySpan<byte> source, Span<char> des
31763176
charsWritten = 0;
31773177
return true;
31783178
}
3179-
else if (source.Length > int.MaxValue / 2 || destination.Length > source.Length * 2)
3179+
else if (source.Length > int.MaxValue / 2 || destination.Length < source.Length * 2)
31803180
{
31813181
charsWritten = 0;
31823182
return false;

src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/Convert.ToHexString.cs

+75-2
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,23 @@ public static void KnownByteSequence()
1414
{
1515
byte[] inputBytes = new byte[] { 0x00, 0x01, 0x02, 0xFD, 0xFE, 0xFF };
1616
Assert.Equal("000102FDFEFF", Convert.ToHexString(inputBytes));
17+
18+
Span<char> output = stackalloc char[12];
19+
Assert.True(Convert.TryToHexString(inputBytes, output, out int charsWritten));
20+
Assert.Equal(12, charsWritten);
21+
Assert.Equal("000102FDFEFF", output.ToString());
1722
}
1823

1924
[Fact]
2025
public static void KnownByteSequenceLower()
2126
{
2227
byte[] inputBytes = new byte[] { 0x00, 0x01, 0x02, 0xFD, 0xFE, 0xFF };
2328
Assert.Equal("000102fdfeff", Convert.ToHexStringLower(inputBytes));
29+
30+
Span<char> output = stackalloc char[12];
31+
Assert.True(Convert.TryToHexStringLower(inputBytes, output, out int charsWritten));
32+
Assert.Equal(12, charsWritten);
33+
Assert.Equal("000102fdfeff", output.ToString());
2434
}
2535

2636
[Fact]
@@ -34,7 +44,13 @@ public static void CompleteValueRange()
3444
sb.Append($"{i:X2}");
3545
}
3646

37-
Assert.Equal(sb.ToString(), Convert.ToHexString(values));
47+
string excepted = sb.ToString();
48+
Assert.Equal(excepted, Convert.ToHexString(values));
49+
50+
Span<char> output = stackalloc char[512];
51+
Assert.True(Convert.TryToHexString(values, output, out int charsWritten));
52+
Assert.Equal(512, charsWritten);
53+
Assert.Equal(excepted, output.ToString());
3854
}
3955

4056
[Fact]
@@ -48,7 +64,13 @@ public static void CompleteValueRangeLower()
4864
sb.Append($"{i:x2}");
4965
}
5066

51-
Assert.Equal(sb.ToString(), Convert.ToHexStringLower(values));
67+
string excepted = sb.ToString();
68+
Assert.Equal(excepted, Convert.ToHexStringLower(values));
69+
70+
Span<char> output = stackalloc char[512];
71+
Assert.True(Convert.TryToHexStringLower(values, output, out int charsWritten));
72+
Assert.Equal(512, charsWritten);
73+
Assert.Equal(excepted, output.ToString());
5274
}
5375

5476
[Fact]
@@ -57,6 +79,13 @@ public static void ZeroLength()
5779
byte[] inputBytes = Convert.FromHexString("000102FDFEFF");
5880
Assert.Same(string.Empty, Convert.ToHexString(inputBytes, 0, 0));
5981
Assert.Same(string.Empty, Convert.ToHexStringLower(inputBytes, 0, 0));
82+
83+
int charsWritten;
84+
Span<char> output = stackalloc char[12];
85+
Assert.True(Convert.TryToHexString(default, output, out charsWritten));
86+
Assert.Equal(0, charsWritten);
87+
Assert.True(Convert.TryToHexStringLower(default, output, out charsWritten));
88+
Assert.Equal(0, charsWritten);
6089
}
6190

6291
[Fact]
@@ -68,6 +97,22 @@ public static void InvalidInputBuffer()
6897
AssertExtensions.Throws<ArgumentNullException>("inArray", () => Convert.ToHexStringLower(null, 0, 0));
6998
}
7099

100+
[Fact]
101+
public static void InvalidOutputBuffer()
102+
{
103+
byte[] inputBytes = new byte[] { 0x00, 0x01, 0x02, 0xFD, 0xFE, 0xFF };
104+
int charsWritten;
105+
Span<char> output = stackalloc char[11];
106+
Assert.False(Convert.TryToHexString(inputBytes, default, out charsWritten));
107+
Assert.Equal(0, charsWritten);
108+
Assert.False(Convert.TryToHexString(inputBytes, output, out charsWritten));
109+
Assert.Equal(0, charsWritten);
110+
Assert.False(Convert.TryToHexStringLower(inputBytes, default, out charsWritten));
111+
Assert.Equal(0, charsWritten);
112+
Assert.False(Convert.TryToHexStringLower(inputBytes, output, out charsWritten));
113+
Assert.Equal(0, charsWritten);
114+
}
115+
71116
[Fact]
72117
public static void InvalidOffset()
73118
{
@@ -95,6 +140,13 @@ public static unsafe void InputTooLarge()
95140
{
96141
AssertExtensions.Throws<ArgumentOutOfRangeException>("bytes", () => Convert.ToHexString(new ReadOnlySpan<byte>((void*)0, Int32.MaxValue)));
97142
AssertExtensions.Throws<ArgumentOutOfRangeException>("bytes", () => Convert.ToHexStringLower(new ReadOnlySpan<byte>((void*)0, Int32.MaxValue)));
143+
144+
int charsWritten;
145+
Span<char> output = new Span<char>((void*)0, Int32.MaxValue);
146+
Assert.False(Convert.TryToHexString(new ReadOnlySpan<byte>((void*)0, Int32.MaxValue), output, out charsWritten));
147+
Assert.Equal(0, charsWritten);
148+
Assert.False(Convert.TryToHexStringLower(new ReadOnlySpan<byte>((void*)0, Int32.MaxValue), output, out charsWritten));
149+
Assert.Equal(0, charsWritten);
98150
}
99151

100152
public static IEnumerable<object[]> ToHexStringTestData()
@@ -137,12 +189,33 @@ public static unsafe void ToHexString(byte[] input, string expected)
137189
Assert.Equal(expected, actual);
138190
}
139191

192+
[Theory]
193+
[MemberData(nameof(ToHexStringTestData))]
194+
public static unsafe void TryToHexString(byte[] input, string expected)
195+
{
196+
Span<char> output = new char[expected.Length];
197+
Assert.True(Convert.TryToHexString(input, output, out int charsWritten));
198+
Assert.Equal(expected.Length, charsWritten);
199+
Assert.Equal(expected, output.ToString());
200+
}
201+
202+
140203
[Theory]
141204
[MemberData(nameof(ToHexStringTestData))]
142205
public static unsafe void ToHexStringLower(byte[] input, string expected)
143206
{
144207
string actual = Convert.ToHexStringLower(input);
145208
Assert.Equal(expected.ToLower(), actual);
146209
}
210+
211+
[Theory]
212+
[MemberData(nameof(ToHexStringTestData))]
213+
public static unsafe void TryToHexStringLower(byte[] input, string expected)
214+
{
215+
Span<char> output = new char[expected.Length];
216+
Assert.True(Convert.TryToHexStringLower(input, output, out int charsWritten));
217+
Assert.Equal(expected.Length, charsWritten);
218+
Assert.Equal(expected.ToLower(), output.ToString());
219+
}
147220
}
148221
}

0 commit comments

Comments
 (0)