Skip to content

Commit a09352a

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

File tree

1 file changed

+73
-1
lines changed

1 file changed

+73
-1
lines changed

kaitaistruct.py

+73-1
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ def size(self):
125125
def read_s1(self):
126126
return KaitaiStream.packer_s1.unpack(self.read_bytes(1))[0]
127127

128+
def write_s1(self, data):
129+
return self.write_bytes(KaitaiStream.packer_s1.pack(data))
130+
128131
# ........................................................................
129132
# Big-endian
130133
# ........................................................................
@@ -138,6 +141,15 @@ def read_s4be(self):
138141
def read_s8be(self):
139142
return KaitaiStream.packer_s8be.unpack(self.read_bytes(8))[0]
140143

144+
def write_s2be(self, data):
145+
return self.write_bytes(KaitaiStream.packer_s2be.pack(data))
146+
147+
def write_s4be(self, data):
148+
return self.write_bytes(KaitaiStream.packer_s4be.pack(data))
149+
150+
def write_s8be(self, data):
151+
return self.write_bytes(KaitaiStream.packer_s8be.pack(data))
152+
141153
# ........................................................................
142154
# Little-endian
143155
# ........................................................................
@@ -151,13 +163,25 @@ def read_s4le(self):
151163
def read_s8le(self):
152164
return KaitaiStream.packer_s8le.unpack(self.read_bytes(8))[0]
153165

166+
def write_s2le(self, data):
167+
return self.write_bytes(KaitaiStream.packer_s2le.pack(data))
168+
169+
def write_s4le(self, data):
170+
return self.write_bytes(KaitaiStream.packer_s4le.pack(data))
171+
172+
def write_s8le(self, data):
173+
return self.write_bytes(KaitaiStream.packer_s8le.pack(data))
174+
154175
# ------------------------------------------------------------------------
155176
# Unsigned
156177
# ------------------------------------------------------------------------
157178

158179
def read_u1(self):
159180
return KaitaiStream.packer_u1.unpack(self.read_bytes(1))[0]
160181

182+
def write_u1(self, data):
183+
return self.write_bytes(KaitaiStream.packer_u1.pack(data))
184+
161185
# ........................................................................
162186
# Big-endian
163187
# ........................................................................
@@ -171,6 +195,15 @@ def read_u4be(self):
171195
def read_u8be(self):
172196
return KaitaiStream.packer_u8be.unpack(self.read_bytes(8))[0]
173197

198+
def write_u2be(self, data):
199+
return self.write_bytes(KaitaiStream.packer_u2be.pack(data))
200+
201+
def write_u4be(self, data):
202+
return self.write_bytes(KaitaiStream.packer_u4be.pack(data))
203+
204+
def write_u8be(self, data):
205+
return self.write_bytes(KaitaiStream.packer_u8be.pack(data))
206+
174207
# ........................................................................
175208
# Little-endian
176209
# ........................................................................
@@ -184,6 +217,15 @@ def read_u4le(self):
184217
def read_u8le(self):
185218
return KaitaiStream.packer_u8le.unpack(self.read_bytes(8))[0]
186219

220+
def write_u2le(self, data):
221+
return self.write_bytes(KaitaiStream.packer_u2le.pack(data))
222+
223+
def write_u4le(self, data):
224+
return self.write_bytes(KaitaiStream.packer_u4le.pack(data))
225+
226+
def write_u8le(self, data):
227+
return self.write_bytes(KaitaiStream.packer_u8le.pack(data))
228+
187229
# ========================================================================
188230
# Floating point numbers
189231
# ========================================================================
@@ -203,6 +245,12 @@ def read_f4be(self):
203245
def read_f8be(self):
204246
return KaitaiStream.packer_f8be.unpack(self.read_bytes(8))[0]
205247

248+
def write_f4be(self, data):
249+
return self.write_bytes(KaitaiStream.packer_f4be.pack(data))
250+
251+
def write_f8be(self, data):
252+
return self.write_bytes(KaitaiStream.packer_f8be.pack(data))
253+
206254
# ........................................................................
207255
# Little-endian
208256
# ........................................................................
@@ -213,6 +261,12 @@ def read_f4le(self):
213261
def read_f8le(self):
214262
return KaitaiStream.packer_f8le.unpack(self.read_bytes(8))[0]
215263

264+
def write_f4le(self, data):
265+
return self.write_bytes(KaitaiStream.packer_f4le.pack(data))
266+
267+
def write_f8le(self, data):
268+
return self.write_bytes(KaitaiStream.packer_f8le.pack(data))
269+
216270
# ========================================================================
217271
# Unaligned bit values
218272
# ========================================================================
@@ -293,6 +347,21 @@ def read_bytes(self, n):
293347
)
294348
return r
295349

350+
def write_bytes(self, data, pad=0, padding=b'\0'):
351+
if data is None:
352+
return
353+
nb = len(data)
354+
if nb == 0 and align < 2 and pad < 1:
355+
return
356+
if self._io.write(data) != nb:
357+
raise Exception(
358+
"not all of %d bytes written" %
359+
(nb,)
360+
)
361+
if pad > 0 and padding is not None:
362+
self._io.write(padding * pad)
363+
return
364+
296365
def read_bytes_full(self):
297366
return self._io.read()
298367

@@ -317,6 +386,9 @@ def read_bytes_term(self, term, include_term, consume_term, eos_error):
317386
else:
318387
r += c
319388

389+
def write_bytes_term(self, data, term=b'\0'):
390+
self.write_bytes(data, pad=1, padding=term)
391+
320392
def ensure_fixed_contents(self, expected):
321393
actual = self._io.read(len(expected))
322394
if actual != expected:
@@ -327,7 +399,7 @@ def ensure_fixed_contents(self, expected):
327399
return actual
328400

329401
@staticmethod
330-
def bytes_strip_right(data, pad_byte):
402+
def bytes_strip_right(data, pad_byte=b'\0'):
331403
new_len = len(data)
332404
if PY2:
333405
# data[...] must yield an integer, to compare with integer pad_byte

0 commit comments

Comments
 (0)