@@ -118,6 +118,9 @@ def size(self):
118
118
packer_u4le = struct .Struct ('<I' )
119
119
packer_u8le = struct .Struct ('<Q' )
120
120
121
+ # ------------------------------------------------------------------------
122
+ # Reading
123
+ # ------------------------------------------------------------------------
121
124
# ------------------------------------------------------------------------
122
125
# Signed
123
126
# ------------------------------------------------------------------------
@@ -213,6 +216,95 @@ def read_f4le(self):
213
216
def read_f8le (self ):
214
217
return KaitaiStream .packer_f8le .unpack (self .read_bytes (8 ))[0 ]
215
218
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
+
216
308
# ========================================================================
217
309
# Unaligned bit values
218
310
# ========================================================================
@@ -293,6 +385,45 @@ def read_bytes(self, n):
293
385
)
294
386
return r
295
387
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 ValidationFailedError (
394
+ "not all of %d bytes written" %
395
+ (nb ,), self ._io , __file__
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 KaitaiStructError ("no padding filler provided" , __file__ )
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 ValidationFailedError (
416
+ "not all of %d bytes written" %
417
+ (nb ,), self ._io , __file__
418
+ )
419
+ else :
420
+ raise ValidationFailedError (
421
+ "Writing %d bytes, but %d bytes (including terminator) were given" %
422
+ (size , nb + 1 ), self ._io , __file__
423
+ )
424
+ self .write_terminator (term_byte )
425
+ self .write_padding (nb , size - 1 , pad_byte )
426
+
296
427
def read_bytes_full (self ):
297
428
return self ._io .read ()
298
429
@@ -302,7 +433,7 @@ def read_bytes_term(self, term, include_term, consume_term, eos_error):
302
433
c = self ._io .read (1 )
303
434
if c == b'' :
304
435
if eos_error :
305
- raise Exception (
436
+ raise EOFError (
306
437
"end of stream reached, but no terminator %d found" %
307
438
(term ,)
308
439
)
@@ -320,10 +451,7 @@ def read_bytes_term(self, term, include_term, consume_term, eos_error):
320
451
def ensure_fixed_contents (self , expected ):
321
452
actual = self ._io .read (len (expected ))
322
453
if actual != expected :
323
- raise Exception (
324
- "unexpected fixed contents: got %r, was waiting for %r" %
325
- (actual , expected )
326
- )
454
+ raise ValidationNotEqualError (expected , actual , self ._io , __file__ )
327
455
return actual
328
456
329
457
@staticmethod
@@ -375,9 +503,9 @@ def process_xor_many(data, key):
375
503
@staticmethod
376
504
def process_rotate_left (data , amount , group_size ):
377
505
if group_size != 1 :
378
- raise Exception (
506
+ raise KaitaiStructError (
379
507
"unable to rotate group of %d bytes yet" %
380
- (group_size ,)
508
+ (group_size ,), __file__
381
509
)
382
510
383
511
mask = group_size * 8 - 1
0 commit comments