py3: make SNB output work

variables initialized as implicit bytes '' on python2, should be b''
python2 used integer division, make this explicit on python3
This commit is contained in:
Eli Schwartz 2019-04-16 18:36:03 -04:00
parent 6583e1e2fb
commit 7fbf985870
No known key found for this signature in database
GPG Key ID: CEB167EFB5722BD6

View File

@ -23,7 +23,7 @@ class BlockData:
class SNBFile: class SNBFile:
MAGIC = 'SNBP000B' MAGIC = b'SNBP000B'
REV80 = 0x00008000 REV80 = 0x00008000
REVA3 = 0x00A3A3A3 REVA3 = 0x00A3A3A3
REVZ1 = 0x00000000 REVZ1 = 0x00000000
@ -75,7 +75,7 @@ class SNBFile:
if f.attr & 0x41000000 == 0x41000000: if f.attr & 0x41000000 == 0x41000000:
# Compressed Files # Compressed Files
if uncompressedData is None: if uncompressedData is None:
uncompressedData = "" uncompressedData = b""
for i in range(self.plainBlock): for i in range(self.plainBlock):
bzdc = bz2.BZ2Decompressor() bzdc = bz2.BZ2Decompressor()
if (i < self.plainBlock - 1): if (i < self.plainBlock - 1):
@ -106,7 +106,7 @@ class SNBFile:
raise Exception("Invalid file") raise Exception("Invalid file")
def ParseFile(self, vfat, fileCount): def ParseFile(self, vfat, fileCount):
fileNames = vfat[fileCount*12:].split('\0') fileNames = vfat[fileCount*12:].split(b'\0')
for i in range(fileCount): for i in range(fileCount):
f = FileStream() f = FileStream()
(f.attr, f.fileNameOffset, f.fileSize) = struct.unpack('>iii', vfat[i * 12 : (i+1)*12]) (f.attr, f.fileNameOffset, f.fileSize) = struct.unpack('>iii', vfat[i * 12 : (i+1)*12])
@ -114,8 +114,8 @@ class SNBFile:
self.files.append(f) self.files.append(f)
def ParseTail(self, vtail, fileCount): def ParseTail(self, vtail, fileCount):
self.binBlock = (self.binStreamSize + 0x8000 - 1) / 0x8000 self.binBlock = (self.binStreamSize + 0x8000 - 1) // 0x8000
self.plainBlock = (self.plainStreamSizeUncompressed + 0x8000 - 1) / 0x8000 self.plainBlock = (self.plainStreamSizeUncompressed + 0x8000 - 1) // 0x8000
for i in range(self.binBlock + self.plainBlock): for i in range(self.binBlock + self.plainBlock):
block = BlockData() block = BlockData()
(block.Offset,) = struct.unpack('>i', vtail[i * 4 : (i+1) * 4]) (block.Offset,) = struct.unpack('>i', vtail[i * 4 : (i+1) * 4])
@ -204,13 +204,13 @@ class SNBFile:
vmbrp1 = struct.pack('>8siiii', SNBFile.MAGIC, SNBFile.REV80, SNBFile.REVA3, SNBFile.REVZ1, len(self.files)) vmbrp1 = struct.pack('>8siiii', SNBFile.MAGIC, SNBFile.REV80, SNBFile.REVA3, SNBFile.REVZ1, len(self.files))
# Create VFAT & file stream # Create VFAT & file stream
vfat = '' vfat = b''
fileNameTable = '' fileNameTable = b''
plainStream = '' plainStream = b''
binStream = '' binStream = b''
for f in self.files: for f in self.files:
vfat += struct.pack('>iii', f.attr, len(fileNameTable), f.fileSize) vfat += struct.pack('>iii', f.attr, len(fileNameTable), f.fileSize)
fileNameTable += (f.fileName + '\0') fileNameTable += (f.fileName + b'\0')
if f.attr & 0x41000000 == 0x41000000: if f.attr & 0x41000000 == 0x41000000:
# Plain Files # Plain Files
@ -236,22 +236,22 @@ class SNBFile:
binBlockOffset = 0x2C + len(vfatCompressed) binBlockOffset = 0x2C + len(vfatCompressed)
plainBlockOffset = binBlockOffset + len(binStream) plainBlockOffset = binBlockOffset + len(binStream)
binBlock = (len(binStream) + 0x8000 - 1) / 0x8000 binBlock = (len(binStream) + 0x8000 - 1) // 0x8000
# plainBlock = (len(plainStream) + 0x8000 - 1) / 0x8000 # plainBlock = (len(plainStream) + 0x8000 - 1) / 0x8000
offset = 0 offset = 0
tailBlock = '' tailBlock = b''
for i in range(binBlock): for i in range(binBlock):
tailBlock += struct.pack('>i', binBlockOffset + offset) tailBlock += struct.pack('>i', binBlockOffset + offset)
offset += 0x8000 offset += 0x8000
tailRec = '' tailRec = b''
for f in self.files: for f in self.files:
t = 0 t = 0
if f.IsBinary(): if f.IsBinary():
t = 0 t = 0
else: else:
t = binBlock t = binBlock
tailRec += struct.pack('>ii', f.contentOffset / 0x8000 + t, f.contentOffset % 0x8000) tailRec += struct.pack('>ii', f.contentOffset // 0x8000 + t, f.contentOffset % 0x8000)
# Write binary stream # Write binary stream
outputFile.write(binStream) outputFile.write(binStream)