mirror of
https://github.com/brouhaha/sosar.git
synced 2025-03-16 22:30:36 +00:00
Minor changes
This commit is contained in:
parent
c27ca404b8
commit
e75f73d5c5
4
sosar.py
4
sosar.py
@ -19,8 +19,8 @@ def cmd_extract(args, disk):
|
||||
name = sf.get_name()
|
||||
#print(name)
|
||||
#print(len(name))
|
||||
eof = sf.get_eof()
|
||||
data = sf.read(0, eof)
|
||||
length = len(sf)
|
||||
data = sf.read(length)
|
||||
#print(len(data))
|
||||
with open(name, 'wb') as f:
|
||||
f.write(data)
|
||||
|
43
sosdisk.py
43
sosdisk.py
@ -213,7 +213,7 @@ class SOSStorage:
|
||||
def is_sparse(self):
|
||||
return self.data_blocks != (self.last_block_index + 1)
|
||||
|
||||
def read(self,
|
||||
def get_bytes(self,
|
||||
offset = 0,
|
||||
length = 0):
|
||||
data = bytearray(length)
|
||||
@ -228,6 +228,20 @@ class SOSStorage:
|
||||
length -= chunk_length
|
||||
return data
|
||||
|
||||
def __getitem__(self, key):
|
||||
if isinstance(key, slice):
|
||||
indices = key.indices((self.last_block_index+1) * 512)
|
||||
length = len(range(*indices))
|
||||
if indices[2] == 1:
|
||||
return self.get_bytes(indices[0], length)
|
||||
else:
|
||||
data = bytearray(length)
|
||||
for i in range(*indices):
|
||||
data[i] = self.get_bytes(i, 1)
|
||||
return data
|
||||
else:
|
||||
return self.get_bytes(key, 1);
|
||||
|
||||
|
||||
class SOSSeedling(SOSStorage):
|
||||
def __init__(self, disk, key_pointer):
|
||||
@ -328,6 +342,7 @@ class SOSFileEntry(SOSDirectoryEntry):
|
||||
self.storage_type = StorageType(storage_nl >> 4)
|
||||
if self.storage_type == StorageType.unused_entry:
|
||||
return
|
||||
self.pos = 0
|
||||
self.eof = eof [2] << 16 | eof [1] << 8 | eof[0]
|
||||
self.name = bytes_to_sos_filename(name_length, name_b)
|
||||
self.creation = u32_to_sos_timestamp(creation_b)
|
||||
@ -344,14 +359,30 @@ class SOSFileEntry(SOSDirectoryEntry):
|
||||
return self.name
|
||||
|
||||
|
||||
def get_eof(self):
|
||||
def __len__(self):
|
||||
return self.eof
|
||||
|
||||
|
||||
def read(self,
|
||||
offset = 0,
|
||||
length = None):
|
||||
return self.storage.read(offset, length)
|
||||
def __getitem__(self, key):
|
||||
return self.storage.__getitem__(key)
|
||||
|
||||
|
||||
def seek(self, offset, from_what = 0):
|
||||
if from_what == 0:
|
||||
self.pos = offset
|
||||
elif from_what == 1:
|
||||
self.pos += offset
|
||||
elif from_what == 2:
|
||||
self.pos = self.eof + offset
|
||||
else:
|
||||
assert False
|
||||
|
||||
def read(self, length = None):
|
||||
if length is None:
|
||||
length = self.eof - self.pos
|
||||
data = self.storage[self.pos:self.pos+length]
|
||||
self.pos += len(data)
|
||||
return data
|
||||
|
||||
|
||||
def print(self,
|
||||
|
Loading…
x
Reference in New Issue
Block a user