@@ -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