Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1class BytesReaderError(Error): 

2 pass 

3 

4class BytesReader: 

5 _data: bytes 

6 _pos: i64 

7 

8 func __init__(self, data: bytes): 

9 self._data = data 

10 self._pos = 0 

11 

12 func available(self) -> bool: 

13 return self._pos < self._data.length() 

14 

15 func read_u8(self) -> u8: 

16 if not self.available(): 

17 raise BytesReaderError() 

18 

19 value = self._data[self._pos] 

20 self._pos += 1 

21 

22 return value 

23 

24 func read_u16(self) -> u16: 

25 return (u16(self.read_u8()) << 8) | u16(self.read_u8()) 

26 

27 func read_u32(self) -> u32: 

28 return (u32(self.read_u16()) << 16) | u32(self.read_u16()) 

29 

30 func read_u64(self) -> u64: 

31 return (u64(self.read_u32()) << 32) | u64(self.read_u32()) 

32 

33 func read_i8(self) -> i8: 

34 return i8(self.read_u8()) 

35 

36 func read_i16(self) -> i16: 

37 return i16(self.read_u16()) 

38 

39 func read_i32(self) -> i32: 

40 return i32(self.read_u32()) 

41 

42 func read_i64(self) -> i64: 

43 return i64(self.read_u64()) 

44 

45 func read_bytes(self, count: i64) -> bytes: 

46 data = b"" 

47 

48 for _ in range(count): 

49 data += self.read_u8() 

50 

51 return data 

52 

53test read_unsigned(): 

54 reader = BytesReader( 

55 b"\x12\x34\x56\x78\x9a\xbc\xde\x01\x23\x45\x67\x89\xab\xcd\xef") 

56 assert reader.read_u8() == u8(0x12) 

57 assert reader.read_u16() == u16(0x3456) 

58 assert reader.read_u32() == u32(0x789abcde) 

59 assert reader.read_u64() == u64(0x0123456789abcdef) 

60 

61test read_signed(): 

62 reader = BytesReader( 

63 b"\x12\x34\x56\x78\x9a\xbc\xde\x01\x23\x45\x67\x89\xab\xcd\xef") 

64 assert reader.read_i8() == i8(0x12) 

65 assert reader.read_i16() == i16(0x3456) 

66 assert reader.read_i32() == i32(0x789abcde) 

67 assert reader.read_i64() == i64(0x0123456789abcdef) 

68 

69test read_bytes(): 

70 reader = BytesReader(b"\x12\x34\x56\x78\x9a\xbc\xde") 

71 assert reader.read_bytes(2) == b"\x12\x34" 

72 assert reader.read_bytes(3) == b"\x56\x78\x9a" 

73 assert reader.read_bytes(0) == b"" 

74 assert reader.read_bytes(1) == b"\xbc"