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
4class BytesReader:
5 _data: bytes
6 _pos: i64
8 func __init__(self, data: bytes):
9 self._data = data
10 self._pos = 0
12 func available(self) -> bool:
13 return self._pos < self._data.length()
15 func read_u8(self) -> u8:
16 if not self.available():
17 raise BytesReaderError()
19 value = self._data[self._pos]
20 self._pos += 1
22 return value
24 func read_u16(self) -> u16:
25 return (u16(self.read_u8()) << 8) | u16(self.read_u8())
27 func read_u32(self) -> u32:
28 return (u32(self.read_u16()) << 16) | u32(self.read_u16())
30 func read_u64(self) -> u64:
31 return (u64(self.read_u32()) << 32) | u64(self.read_u32())
33 func read_i8(self) -> i8:
34 return i8(self.read_u8())
36 func read_i16(self) -> i16:
37 return i16(self.read_u16())
39 func read_i32(self) -> i32:
40 return i32(self.read_u32())
42 func read_i64(self) -> i64:
43 return i64(self.read_u64())
45 func read_bytes(self, count: i64) -> bytes:
46 data = b""
48 for _ in range(count):
49 data += self.read_u8()
51 return data
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)
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)
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"