Skip to content

Commit c5b707a

Browse files
Add methods for serialization
1 parent 4b97420 commit c5b707a

File tree

1 file changed

+132
-1
lines changed

1 file changed

+132
-1
lines changed

kaitaistruct.py

+132-1
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)