@@ -159,42 +159,12 @@ def __init__(self):
159159
160160 def render (
161161 data : Union [renderers .LayerData , interfaces .renderers .BaseAbsentValue ],
162- ):
162+ ) -> str :
163163 if isinstance (data , interfaces .renderers .BaseAbsentValue ):
164164 # FIXME: Do something cleverer here
165165 return ""
166166
167- context_byte_len = self .context_byte_len if not data .no_surrounding else 0
168-
169- layer = data .context .layers [data .layer_name ]
170- # Map of the holes
171- error_bytes = set ()
172- start_offset = data .offset - context_byte_len
173- end_offset = data .offset + data .length + context_byte_len
174- if isinstance (layer , interfaces .layers .TranslationLayerInterface ):
175- error_bytes = set ()
176- mapping = iter (layer .mapping (start_offset , end_offset , True ))
177- current_map = next (mapping )
178- for i in range (start_offset , end_offset ):
179- # Run through the bytes, check if they're present
180- offset , sublength , _ , _ , _ = current_map
181- if i < offset :
182- error_bytes .add (i - start_offset )
183- if i > offset + sublength :
184- try :
185- current_map = next (mapping )
186- except StopIteration :
187- pass
188- offset , sublength , _ , _ , _ = current_map
189- if i > offset + sublength :
190- error_bytes .add (i - start_offset )
191-
192- # Padded data
193- specific_data = data .context .layers [data .layer_name ].read (
194- start_offset ,
195- end_offset - start_offset ,
196- True ,
197- )
167+ specific_data , error_bytes = self .render_bytes (data )
198168
199169 printables = ""
200170 output = "\n "
@@ -224,6 +194,46 @@ def render(
224194 render_func = render
225195 return super ().__init__ (render_func )
226196
197+ def render_bytes (self , data : renderers .LayerData ) -> tuple [bytes , set [int ]]:
198+ """Renders a valid LayerData into bytes (with context bytes)"""
199+ context_byte_len = self .context_byte_len if not data .no_surrounding else 0
200+
201+ layer = data .context .layers [data .layer_name ]
202+ # Map of the holes
203+ error_bytes = set ()
204+ start_offset = data .offset - context_byte_len
205+ end_offset = data .offset + data .length + context_byte_len
206+ if isinstance (layer , interfaces .layers .TranslationLayerInterface ):
207+ error_bytes = set ()
208+ mapping = iter (layer .mapping (start_offset , end_offset , True ))
209+ current_map = next (mapping )
210+ for i in range (start_offset , end_offset ):
211+ # Run through the bytes, check if they're present
212+ offset , sublength , _ , _ , _ = current_map
213+ if i < offset :
214+ error_bytes .add (i - start_offset )
215+ if i > offset + sublength :
216+ try :
217+ current_map = next (mapping )
218+ except StopIteration :
219+ pass
220+ offset , sublength , _ , _ , _ = current_map
221+ if i > offset + sublength :
222+ error_bytes .add (i - start_offset )
223+
224+ # Padded data
225+ specific_data = data .context .layers [data .layer_name ].read (
226+ start_offset ,
227+ end_offset - start_offset ,
228+ True ,
229+ )
230+
231+ import pdb
232+
233+ pdb .set_trace ()
234+
235+ return specific_data , error_bytes
236+
227237
228238class CLIRenderer (interfaces .renderers .Renderer ):
229239 """Class to add specific requirements for CLI renderers."""
@@ -525,9 +535,10 @@ def tab_stop(self, line: str) -> str:
525535
526536class JsonRenderer (CLIRenderer ):
527537 _type_renderers = {
528- format_hints .HexBytes : quoted_optional ( hex_bytes_as_text ),
538+ format_hints .HexBytes : lambda x : x . hex ( " " ),
529539 renderers .Disassembly : quoted_optional (display_disassembly ),
530540 format_hints .MultiTypeData : quoted_optional (multitypedata_as_text ),
541+ renderers .LayerData : lambda x : LayerDataRenderer ().render_bytes (x )[0 ].hex (" " ),
531542 bytes : optional (lambda x : " " .join (f"{ b :02x} " for b in x )),
532543 datetime .datetime : lambda x : (
533544 x .isoformat ()
0 commit comments