diff --git a/telethon/extensions/binaryreader.py b/telethon/extensions/binaryreader.py index 996f362e..84f3b5bc 100644 --- a/telethon/extensions/binaryreader.py +++ b/telethon/extensions/binaryreader.py @@ -1,11 +1,9 @@ """ This module contains the BinaryReader utility class. """ -import os +import struct import time -from datetime import datetime, timezone, timedelta -from io import BytesIO -from struct import unpack +from datetime import datetime, timedelta, timezone from ..errors import TypeNotFoundError from ..tl.alltlobjects import tlobjects @@ -21,7 +19,8 @@ class BinaryReader: """ def __init__(self, data): - self.stream = BytesIO(data) + self.stream = data or b'' + self.position = 0 self._last = None # Should come in handy to spot -404 errors # region Reading @@ -30,23 +29,35 @@ class BinaryReader: # https://core.telegram.org/mtproto def read_byte(self): """Reads a single byte value.""" - return self.read(1)[0] + value, = struct.unpack_from("= 0: + result = self.stream[self.position:self.position + length] + self.position += length + else: + result = self.stream[self.position:] + self.position += len(result) if (length >= 0) and (len(result) != length): raise BufferError( 'No more data left to read (need {}, got {}: {}); last read {}' @@ -67,7 +83,7 @@ class BinaryReader: def get_bytes(self): """Gets the byte array representing the current buffer as a whole.""" - return self.stream.getvalue() + return self.stream # endregion @@ -153,24 +169,24 @@ class BinaryReader: def close(self): """Closes the reader, freeing the BytesIO stream.""" - self.stream.close() + self.stream = b'' # region Position related def tell_position(self): """Tells the current position on the stream.""" - return self.stream.tell() + return self.position def set_position(self, position): """Sets the current position on the stream.""" - self.stream.seek(position) + self.position = position def seek(self, offset): """ Seeks the stream position given an offset from the current position. The offset may be negative. """ - self.stream.seek(offset, os.SEEK_CUR) + self.position += offset # endregion