If you should ever find yourself in the position of having to figure out how to compress XFDL files with the asc-gzip encoding, and I don’t wish it on you, here’s Python code to do it. Obviously, you’ll need some imports and error handling and optimization.
This thread gave me pointers to figure this out; Bryan was just a little off because he was using a gzip library rather than a zlib one.
# compress according to wacky XFDL compression scheme
def compress(fc):
CHUNK_SIZE = 60000
out = ''
for i in range(0, len(fc), CHUNK_SIZE):
chunk = fc[i:i + CHUNK_SIZE]
chunklen = len(chunk)
compressedchunk = zlib.compress(chunk)
compressedchunklen = len(compressedchunk)
out += chr(compressedchunklen / 256)
out += chr(compressedchunklen % 256)
out += chr(chunklen / 256)
out += chr(chunklen % 256)
out += compressedchunk
f = StringIO.StringIO()
f.write('application/x-xfdl;content-encoding="asc-gzip"n')
b64 = base64.standard_b64encode(out)
for i in range(0, len(b64), 76):
f.write(b64[i:i+76])
f.write('rn')
ret = f.getvalue()
f.close()
return ret