Skip to content

Commit

Permalink
tools: make reader capable of reading big endian encoding
Browse files Browse the repository at this point in the history
Signed-off-by: Michal Maslanka <michal@redpanda.com>
  • Loading branch information
mmaslankaprv committed Jan 3, 2023
1 parent 6703c93 commit 065d1f4
Showing 1 changed file with 34 additions and 9 deletions.
43 changes: 34 additions & 9 deletions tools/offline_log_viewer/reader.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from enum import Enum
import struct
import collections
from io import BufferedReader, BytesIO
Expand All @@ -9,10 +10,16 @@
('version', 'compat_version', 'size'))


class Endianness(Enum):
BIG_ENDIAN = 0
LITTLE_ENDIAN = 1


class Reader:
def __init__(self, stream: BytesIO):
def __init__(self, stream, endianness=Endianness.LITTLE_ENDIAN):
# BytesIO provides .getBuffer(), BufferedReader peek()
self.stream = BufferedReader(stream)
self.endianness = endianness

@staticmethod
def _decode_zig_zag(v):
Expand All @@ -32,29 +39,33 @@ def read_varint(self):

return Reader._decode_zig_zag(result)

def with_endianness(self, str):
ch = '<' if self.endianness == Endianness.LITTLE_ENDIAN else '>'
return f"{ch}{str}"

def read_int8(self):
return struct.unpack("<b", self.stream.read(1))[0]
return struct.unpack(self.with_endianness('b'), self.stream.read(1))[0]

def read_uint8(self):
return struct.unpack("<B", self.stream.read(1))[0]
return struct.unpack(self.with_endianness('B'), self.stream.read(1))[0]

def read_int16(self):
return struct.unpack("<h", self.stream.read(2))[0]
return struct.unpack(self.with_endianness('h'), self.stream.read(2))[0]

def read_uint16(self):
return struct.unpack("<H", self.stream.read(2))[0]
return struct.unpack(self.with_endianness('H'), self.stream.read(2))[0]

def read_int32(self):
return struct.unpack("<i", self.stream.read(4))[0]
return struct.unpack(self.with_endianness('i'), self.stream.read(4))[0]

def read_uint32(self):
return struct.unpack("<I", self.stream.read(4))[0]
return struct.unpack(self.with_endianness('I'), self.stream.read(4))[0]

def read_int64(self):
return struct.unpack("<q", self.stream.read(8))[0]
return struct.unpack(self.with_endianness('q'), self.stream.read(8))[0]

def read_uint64(self):
return struct.unpack("<Q", self.stream.read(8))[0]
return struct.unpack(self.with_endianness('Q'), self.stream.read(8))[0]

def read_serde_enum(self):
return self.read_int32()
Expand All @@ -70,12 +81,26 @@ def read_string(self):
len = self.read_int32()
return self.stream.read(len).decode('utf-8')

def read_kafka_string(self):
len = self.read_int16()
return self.stream.read(len).decode('utf-8')

def read_kafka_bytes(self):
len = self.read_int32()
return self.stream.read(len)

def read_optional(self, type_read):
present = self.read_int8()
if present == 0:
return None
return type_read(self)

def read_kafka_optional_string(self):
len = self.read_int16()
if len == -1:
return None
return self.stream.read(len).decode('utf-8')

def read_vector(self, type_read):
sz = self.read_int32()
ret = []
Expand Down

0 comments on commit 065d1f4

Please sign in to comment.