You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
2.5 KiB
Python

import struct
import sys
ZERO_BYTE = struct.pack("B", 0)
if sys.version_info[0] < 3:
byte = chr
unbyte = ord
else:
def byte(v):
#return struct.pack("B", v)
return bytes((v,))
def unbyte(v):
return v
class Data:
def __init__(self, rawdata = b"", off = 0):
self.data = rawdata
self.offset = off
def setData(self, rawdata, off = 0):
self.data = rawdata
self.offset = off
def seek(self, off):
self.offset = off
def seekEnd(self, off = 0):
self.offset = len(self.data) + off
def seekRel(self, off = 0):
self.offset += off
def tell(self):
return self.offset
def decode(self, fmt):
size = struct.calcsize(fmt)
val = struct.unpack(fmt, self.data[self.offset : self.offset + size])
self.offset += size
return val
def encode(self, fmt, *args):
data = struct.pack(fmt, *args)
self.write(data)
def read(self, length):
val = self.data[self.offset : self.offset + length]
self.offset += length
return val
def write(self, data):
#todo: handle
if self.offset == len(self.data):
self.data += data
self.offset = len(self.data)
elif self.offset > len(self.data):
self.data += ZERO_BYTE * (self.offset - len(self.data))
self.data += data
self.offset = len(self.data)
elif self.offset + len(data) >= len(self.data):
self.data = self.data[0 : self.offset] + data
else:
self.data = self.data[0 : self.offset] + data + self.data [self.offset + len(data) : ]
def truncate(self, offset = None):
if offset is None:
offset = self.offset
self.data[0 : offset]
def __len__(self):
return len(self.data)
def __str__(self):
return str(self.data)
def __repr__(self):
return repr(self.data)
def extractString(data, offset = 0):
"""Extract an ASCIIZ string from a fixed length buffer."""
for i in range(offset, len(data)):
if unbyte(data[i]) == 0:
return data[offset : i]
pass
return data
def storeString(string, length):
"""Store an ASCIIZ string into a fixed length buffer. If the string is longer than the buffer the output will be truncated, with \\x00 character guarenteed at the end."""
if len(string) >= length:
return string[0 : length - 1] + ZERO_BYTE
else:
return string + ZERO_BYTE * (length - len(string))