Skip to content

Commit 2fa56e5

Browse files
committed
Improved DecodeNumber performance
1 parent 0c98b5a commit 2fa56e5

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

BencodeNET.Net45/Bencode.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -236,11 +236,16 @@ public static BNumber DecodeNumber(BencodeStream stream)
236236
throw new BencodeDecodingException<BNumber>(string.Format("Must begin with 'i' but began with '{0}'.", stream.ReadPreviousChar()), stream.Position);
237237

238238
var digits = new StringBuilder();
239-
while (stream.Peek() != 'e' && stream.Peek() != -1)
239+
char c;
240+
for (c = stream.ReadChar(); c != 'e' && c != default(char); c = stream.ReadChar())
240241
{
241-
digits.Append(stream.ReadChar());
242+
digits.Append(c);
242243
}
243244

245+
// Last read character should be 'e'
246+
if (c != 'e')
247+
throw new BencodeDecodingException<BNumber>("Missing end character 'e'.", stream.Position);
248+
244249
var isNegative = digits[0] == '-';
245250
var numberOfDigits = isNegative ? digits.Length - 1 : digits.Length;
246251

@@ -268,14 +273,11 @@ public static BNumber DecodeNumber(BencodeStream stream)
268273
if (firstDigit == '0' && numberOfDigits == 1 && isNegative)
269274
throw new BencodeDecodingException<BNumber>("'-0' is not a valid number.", startPosition);
270275

271-
if (stream.ReadChar() != 'e')
272-
throw new BencodeDecodingException<BNumber>("Missing end character 'e'.", stream.Position);
273-
274276
long number;
275277
if (!TryParseLongFast(digits.ToString(), out number))
276278
{
277279
throw new BencodeDecodingException<BNumber>(
278-
string.Format("The value '{0}' is invalid. Supported values range from {1:N0} to {2:N0}",
280+
string.Format("The value '{0}' is not a valid long (Int64). Supported values range from '{1:N0}' to '{2:N0}'.",
279281
digits, long.MinValue, long.MaxValue),
280282
stream.Position);
281283
}

0 commit comments

Comments
 (0)