@@ -118,6 +118,9 @@ def size(self):
118118 packer_u4le = struct .Struct ('<I' )
119119 packer_u8le = struct .Struct ('<Q' )
120120
121+ # ------------------------------------------------------------------------
122+ # Reading
123+ # ------------------------------------------------------------------------
121124 # ------------------------------------------------------------------------
122125 # Signed
123126 # ------------------------------------------------------------------------
@@ -213,6 +216,95 @@ def read_f4le(self):
213216 def read_f8le (self ):
214217 return KaitaiStream .packer_f8le .unpack (self .read_bytes (8 ))[0 ]
215218
219+ # ------------------------------------------------------------------------
220+ # Writing
221+ # ------------------------------------------------------------------------
222+ # ------------------------------------------------------------------------
223+ # Signed
224+ # ------------------------------------------------------------------------
225+
226+ def write_s1 (self , data ):
227+ return self .write_bytes (KaitaiStream .packer_s1 .pack (data ))
228+
229+ # ........................................................................
230+ # Big-endian
231+ # ........................................................................
232+
233+ def write_s2be (self , data ):
234+ return self .write_bytes (KaitaiStream .packer_s2be .pack (data ))
235+
236+ def write_s4be (self , data ):
237+ return self .write_bytes (KaitaiStream .packer_s4be .pack (data ))
238+
239+ def write_s8be (self , data ):
240+ return self .write_bytes (KaitaiStream .packer_s8be .pack (data ))
241+
242+ # ........................................................................
243+ # Little-endian
244+ # ........................................................................
245+
246+ def write_s2le (self , data ):
247+ return self .write_bytes (KaitaiStream .packer_s2le .pack (data ))
248+
249+ def write_s4le (self , data ):
250+ return self .write_bytes (KaitaiStream .packer_s4le .pack (data ))
251+
252+ def write_s8le (self , data ):
253+ return self .write_bytes (KaitaiStream .packer_s8le .pack (data ))
254+
255+ # ------------------------------------------------------------------------
256+ # Unsigned
257+ # ------------------------------------------------------------------------
258+
259+ def write_u1 (self , data ):
260+ return self .write_bytes (KaitaiStream .packer_u1 .pack (data ))
261+
262+ # ........................................................................
263+ # Big-endian
264+ # ........................................................................
265+
266+ def write_u2be (self , data ):
267+ return self .write_bytes (KaitaiStream .packer_u2be .pack (data ))
268+
269+ def write_u4be (self , data ):
270+ return self .write_bytes (KaitaiStream .packer_u4be .pack (data ))
271+
272+ def write_u8be (self , data ):
273+ return self .write_bytes (KaitaiStream .packer_u8be .pack (data ))
274+
275+ # ........................................................................
276+ # Little-endian
277+ # ........................................................................
278+
279+ def write_u2le (self , data ):
280+ return self .write_bytes (KaitaiStream .packer_u2le .pack (data ))
281+
282+ def write_u4le (self , data ):
283+ return self .write_bytes (KaitaiStream .packer_u4le .pack (data ))
284+
285+ def write_u8le (self , data ):
286+ return self .write_bytes (KaitaiStream .packer_u8le .pack (data ))
287+
288+ # ........................................................................
289+ # Big-endian
290+ # ........................................................................
291+
292+ def write_f4be (self , data ):
293+ return self .write_bytes (KaitaiStream .packer_f4be .pack (data ))
294+
295+ def write_f8be (self , data ):
296+ return self .write_bytes (KaitaiStream .packer_f8be .pack (data ))
297+
298+ # ........................................................................
299+ # Little-endian
300+ # ........................................................................
301+
302+ def write_f4le (self , data ):
303+ return self .write_bytes (KaitaiStream .packer_f4le .pack (data ))
304+
305+ def write_f8le (self , data ):
306+ return self .write_bytes (KaitaiStream .packer_f8le .pack (data ))
307+
216308 # ========================================================================
217309 # Unaligned bit values
218310 # ========================================================================
@@ -293,6 +385,45 @@ def read_bytes(self, n):
293385 )
294386 return r
295387
388+ def write_bytes (self , data ):
389+ if data is None :
390+ return
391+ nb = len (data )
392+ if nb > 0 and self ._io .write (data ) != nb :
393+ raise Exception (
394+ "not all of %d bytes written" %
395+ (nb ,)
396+ )
397+
398+ def write_terminator (self , term_byte ):
399+ self ._io .write (KaitaiStream .packer_u1 .pack (term_byte ))
400+
401+ def write_padding (self , actual_size , size , pad_byte ):
402+ pad = size - actual_size
403+ if pad > 0 :
404+ if pad_byte is not None :
405+ self ._io .write (KaitaiStream .packer_u1 .pack (pad_byte ) * pad )
406+ else :
407+ raise Exception ("no padding filler provided" )
408+
409+ def write_bytes_term (self , data , size , term_byte , pad_byte ):
410+ if data is None or not size :
411+ return
412+ nb = len (data )
413+ if nb < size :
414+ if nb > 0 and self ._io .write (data ) != nb :
415+ raise Exception (
416+ "not all of %d bytes written" %
417+ (nb ,)
418+ )
419+ else :
420+ raise Exception (
421+ "Writing %d bytes, but %d bytes (including terminator) were given" %
422+ (size , nb + 1 )
423+ )
424+ self .write_terminator (term_byte )
425+ self .write_padding (nb , size - 1 , pad_byte )
426+
296427 def read_bytes_full (self ):
297428 return self ._io .read ()
298429
@@ -302,7 +433,7 @@ def read_bytes_term(self, term, include_term, consume_term, eos_error):
302433 c = self ._io .read (1 )
303434 if c == b'' :
304435 if eos_error :
305- raise Exception (
436+ raise EOFError (
306437 "end of stream reached, but no terminator %d found" %
307438 (term ,)
308439 )
0 commit comments