@@ -44,6 +44,7 @@ def __init__(self, path=None, type_name="SensorView"):
4444 self .type_name = type_name
4545 self .timestep_count = 0
4646 self .retrieved_scenario_size = 0
47+ self ._int_length = len (struct .pack ("<L" , 0 ))
4748
4849 def from_file (self , path , type_name = "SensorView" , max_index = - 1 , format_type = None ):
4950 """Import a scenario from a file"""
@@ -161,19 +162,18 @@ def get_messages_in_index_range(self, begin, end):
161162 """
162163 Yield an iterator over messages of indexes between begin and end included.
163164 """
165+ self .scenario_file .seek (self .message_offsets [begin ])
166+ abs_first_offset = self .message_offsets [begin ]
167+ abs_last_offset = self .message_offsets [end ] \
168+ if end < len (self .message_offsets ) \
169+ else self .retrieved_scenario_size
164170
165- if self .format_type == "separated" :
166- self .scenario_file .seek (self .message_offsets [begin ])
167- abs_first_offset = self .message_offsets [begin ]
168- abs_last_offset = self .message_offsets [end ] \
169- if end < len (self .message_offsets ) \
170- else self .retrieved_scenario_size
171-
172- rel_message_offsets = [
173- abs_message_offset - abs_first_offset
174- for abs_message_offset in self .message_offsets [begin :end ]
175- ]
171+ rel_message_offsets = [
172+ abs_message_offset - abs_first_offset
173+ for abs_message_offset in self .message_offsets [begin :end ]
174+ ]
176175
176+ if self .format_type == "separated" :
177177 message_sequence_len = abs_last_offset - \
178178 abs_first_offset - SEPARATOR_LENGTH
179179 serialized_messages_extract = self .scenario_file .read (
@@ -190,25 +190,26 @@ def get_messages_in_index_range(self, begin, end):
190190 yield message
191191
192192 elif self .format_type is None :
193- self .scenario_file .seek (0 )
194- serialized_message = self .scenario_file .read ()
195- INT_LENGTH = len (struct .pack ("<L" , 0 ))
196- message_length = 0
193+ message_sequence_len = abs_last_offset - abs_first_offset
194+ serialized_messages_extract = self .scenario_file .read (message_sequence_len )
195+
196+ for rel_index , rel_message_offset in enumerate (rel_message_offsets ):
197+ rel_begin = rel_message_offset + self ._int_length
198+ rel_end = (
199+ rel_message_offsets [rel_index + 1 ]
200+ if rel_index + 1 < len (rel_message_offsets )
201+ else message_sequence_len
202+ )
197203
198- i = 0
199- while i < len (serialized_message ):
200204 message = MESSAGES_TYPE [self .type_name ]()
201- message_length = struct .unpack ("<L" , serialized_message [i :INT_LENGTH + i ])[0 ]
202- message .ParseFromString (serialized_message [i + INT_LENGTH :i + INT_LENGTH + message_length ])
203- i += message_length + INT_LENGTH
205+ serialized_message = serialized_messages_extract [rel_begin :rel_end ]
206+ message .ParseFromString (serialized_message )
204207 yield message
205208
206209 else :
207210 self .scenario_file .close ()
208211 raise Exception (f"The defined format { self .format_type } does not exist." )
209212
210- self .scenario_file .close ()
211-
212213 def make_readable (self , name , interval = None , index = None ):
213214 self .scenario_file .seek (0 )
214215 serialized_message = self .scenario_file .read ()
0 commit comments