同步操作将从 OpenHarmony-SIG/python 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
"""Macintosh binhex compression/decompression.easy interface:binhex(inputfilename, outputfilename)hexbin(inputfilename, outputfilename)"""## Jack Jansen, CWI, August 1995.## The module is supposed to be as compatible as possible. Especially the# easy interface should work "as expected" on any platform.# XXXX Note: currently, textfiles appear in mac-form on all platforms.# We seem to lack a simple character-translate in python.# (we should probably use ISO-Latin-1 on all but the mac platform).# XXXX The simple routines are too simple: they expect to hold the complete# files in-core. Should be fixed.# XXXX It would be nice to handle AppleDouble format on unix# (for servers serving macs).# XXXX I don't understand what happens when you get 0x90 times the same byte on# input. The resulting code (xx 90 90) would appear to be interpreted as an# escaped *value* of 0x90. All coders I've seen appear to ignore this nicety...#import ioimport osimport structimport binascii__all__ = ["binhex","hexbin","Error"]class Error(Exception):pass# States (what have we written)_DID_HEADER = 0_DID_DATA = 1# Various constantsREASONABLY_LARGE = 32768 # Minimal amount we pass the rle-coderLINELEN = 64RUNCHAR = b"\x90"## This code is no longer byte-order dependentclass FInfo:def __init__(self):self.Type = '????'self.Creator = '????'self.Flags = 0def getfileinfo(name):finfo = FInfo()with io.open(name, 'rb') as fp:# Quick check for textfiledata = fp.read(512)if 0 not in data:finfo.Type = 'TEXT'fp.seek(0, 2)dsize = fp.tell()dir, file = os.path.split(name)file = file.replace(':', '-', 1)return file, finfo, dsize, 0class openrsrc:def __init__(self, *args):passdef read(self, *args):return b''def write(self, *args):passdef close(self):passclass _Hqxcoderengine:"""Write data to the coder in 3-byte chunks"""def __init__(self, ofp):self.ofp = ofpself.data = b''self.hqxdata = b''self.linelen = LINELEN - 1def write(self, data):self.data = self.data + datadatalen = len(self.data)todo = (datalen // 3) * 3data = self.data[:todo]self.data = self.data[todo:]if not data:returnself.hqxdata = self.hqxdata + binascii.b2a_hqx(data)self._flush(0)def _flush(self, force):first = 0while first <= len(self.hqxdata) - self.linelen:last = first + self.linelenself.ofp.write(self.hqxdata[first:last] + b'\r')self.linelen = LINELENfirst = lastself.hqxdata = self.hqxdata[first:]if force:self.ofp.write(self.hqxdata + b':\r')def close(self):if self.data:self.hqxdata = self.hqxdata + binascii.b2a_hqx(self.data)self._flush(1)self.ofp.close()del self.ofpclass _Rlecoderengine:"""Write data to the RLE-coder in suitably large chunks"""def __init__(self, ofp):self.ofp = ofpself.data = b''def write(self, data):self.data = self.data + dataif len(self.data) < REASONABLY_LARGE:returnrledata = binascii.rlecode_hqx(self.data)self.ofp.write(rledata)self.data = b''def close(self):if self.data:rledata = binascii.rlecode_hqx(self.data)self.ofp.write(rledata)self.ofp.close()del self.ofpclass BinHex:def __init__(self, name_finfo_dlen_rlen, ofp):name, finfo, dlen, rlen = name_finfo_dlen_rlenclose_on_error = Falseif isinstance(ofp, str):ofname = ofpofp = io.open(ofname, 'wb')close_on_error = Truetry:ofp.write(b'(This file must be converted with BinHex 4.0)\r\r:')hqxer = _Hqxcoderengine(ofp)self.ofp = _Rlecoderengine(hqxer)self.crc = 0if finfo is None:finfo = FInfo()self.dlen = dlenself.rlen = rlenself._writeinfo(name, finfo)self.state = _DID_HEADERexcept:if close_on_error:ofp.close()raisedef _writeinfo(self, name, finfo):nl = len(name)if nl > 63:raise Error('Filename too long')d = bytes([nl]) + name.encode("latin-1") + b'0円'tp, cr = finfo.Type, finfo.Creatorif isinstance(tp, str):tp = tp.encode("latin-1")if isinstance(cr, str):cr = cr.encode("latin-1")d2 = tp + cr# Force all structs to be packed with big-endiand3 = struct.pack('>h', finfo.Flags)d4 = struct.pack('>ii', self.dlen, self.rlen)info = d + d2 + d3 + d4self._write(info)self._writecrc()def _write(self, data):self.crc = binascii.crc_hqx(data, self.crc)self.ofp.write(data)def _writecrc(self):# XXXX Should this be here??# self.crc = binascii.crc_hqx('0円0円', self.crc)if self.crc < 0:fmt = '>h'else:fmt = '>H'self.ofp.write(struct.pack(fmt, self.crc))self.crc = 0def write(self, data):if self.state != _DID_HEADER:raise Error('Writing data at the wrong time')self.dlen = self.dlen - len(data)self._write(data)def close_data(self):if self.dlen != 0:raise Error('Incorrect data size, diff=%r' % (self.rlen,))self._writecrc()self.state = _DID_DATAdef write_rsrc(self, data):if self.state < _DID_DATA:self.close_data()if self.state != _DID_DATA:raise Error('Writing resource data at the wrong time')self.rlen = self.rlen - len(data)self._write(data)def close(self):if self.state is None:returntry:if self.state < _DID_DATA:self.close_data()if self.state != _DID_DATA:raise Error('Close at the wrong time')if self.rlen != 0:raise Error("Incorrect resource-datasize, diff=%r" % (self.rlen,))self._writecrc()finally:self.state = Noneofp = self.ofpdel self.ofpofp.close()def binhex(inp, out):"""binhex(infilename, outfilename): create binhex-encoded copy of a file"""finfo = getfileinfo(inp)ofp = BinHex(finfo, out)with io.open(inp, 'rb') as ifp:# XXXX Do textfile translation on non-mac systemswhile True:d = ifp.read(128000)if not d: breakofp.write(d)ofp.close_data()ifp = openrsrc(inp, 'rb')while True:d = ifp.read(128000)if not d: breakofp.write_rsrc(d)ofp.close()ifp.close()class _Hqxdecoderengine:"""Read data via the decoder in 4-byte chunks"""def __init__(self, ifp):self.ifp = ifpself.eof = 0def read(self, totalwtd):"""Read at least wtd bytes (or until EOF)"""decdata = b''wtd = totalwtd## The loop here is convoluted, since we don't really now how# much to decode: there may be newlines in the incoming data.while wtd > 0:if self.eof: return decdatawtd = ((wtd + 2) // 3) * 4data = self.ifp.read(wtd)## Next problem: there may not be a complete number of# bytes in what we pass to a2b. Solve by yet another# loop.#while True:try:decdatacur, self.eof = binascii.a2b_hqx(data)breakexcept binascii.Incomplete:passnewdata = self.ifp.read(1)if not newdata:raise Error('Premature EOF on binhex file')data = data + newdatadecdata = decdata + decdatacurwtd = totalwtd - len(decdata)if not decdata and not self.eof:raise Error('Premature EOF on binhex file')return decdatadef close(self):self.ifp.close()class _Rledecoderengine:"""Read data via the RLE-coder"""def __init__(self, ifp):self.ifp = ifpself.pre_buffer = b''self.post_buffer = b''self.eof = 0def read(self, wtd):if wtd > len(self.post_buffer):self._fill(wtd - len(self.post_buffer))rv = self.post_buffer[:wtd]self.post_buffer = self.post_buffer[wtd:]return rvdef _fill(self, wtd):self.pre_buffer = self.pre_buffer + self.ifp.read(wtd + 4)if self.ifp.eof:self.post_buffer = self.post_buffer + \binascii.rledecode_hqx(self.pre_buffer)self.pre_buffer = b''return## Obfuscated code ahead. We have to take care that we don't# end up with an orphaned RUNCHAR later on. So, we keep a couple# of bytes in the buffer, depending on what the end of# the buffer looks like:# '220円0円220円' - Keep 3 bytes: repeated 220円 (escaped as 220円0円)# '?220円' - Keep 2 bytes: repeated something-else# '220円0円' - Escaped 220円: Keep 2 bytes.# '?220円?' - Complete repeat sequence: decode all# otherwise: keep 1 byte.#mark = len(self.pre_buffer)if self.pre_buffer[-3:] == RUNCHAR + b'0円' + RUNCHAR:mark = mark - 3elif self.pre_buffer[-1:] == RUNCHAR:mark = mark - 2elif self.pre_buffer[-2:] == RUNCHAR + b'0円':mark = mark - 2elif self.pre_buffer[-2:-1] == RUNCHAR:pass # Decode allelse:mark = mark - 1self.post_buffer = self.post_buffer + \binascii.rledecode_hqx(self.pre_buffer[:mark])self.pre_buffer = self.pre_buffer[mark:]def close(self):self.ifp.close()class HexBin:def __init__(self, ifp):if isinstance(ifp, str):ifp = io.open(ifp, 'rb')## Find initial colon.#while True:ch = ifp.read(1)if not ch:raise Error("No binhex data found")# Cater for \r\n terminated lines (which show up as \n\r, hence# all lines start with \r)if ch == b'\r':continueif ch == b':':breakhqxifp = _Hqxdecoderengine(ifp)self.ifp = _Rledecoderengine(hqxifp)self.crc = 0self._readheader()def _read(self, len):data = self.ifp.read(len)self.crc = binascii.crc_hqx(data, self.crc)return datadef _checkcrc(self):filecrc = struct.unpack('>h', self.ifp.read(2))[0] & 0xffff#self.crc = binascii.crc_hqx('0円0円', self.crc)# XXXX Is this needed??self.crc = self.crc & 0xffffif filecrc != self.crc:raise Error('CRC error, computed %x, read %x'% (self.crc, filecrc))self.crc = 0def _readheader(self):len = self._read(1)fname = self._read(ord(len))rest = self._read(1 + 4 + 4 + 2 + 4 + 4)self._checkcrc()type = rest[1:5]creator = rest[5:9]flags = struct.unpack('>h', rest[9:11])[0]self.dlen = struct.unpack('>l', rest[11:15])[0]self.rlen = struct.unpack('>l', rest[15:19])[0]self.FName = fnameself.FInfo = FInfo()self.FInfo.Creator = creatorself.FInfo.Type = typeself.FInfo.Flags = flagsself.state = _DID_HEADERdef read(self, *n):if self.state != _DID_HEADER:raise Error('Read data at wrong time')if n:n = n[0]n = min(n, self.dlen)else:n = self.dlenrv = b''while len(rv) < n:rv = rv + self._read(n-len(rv))self.dlen = self.dlen - nreturn rvdef close_data(self):if self.state != _DID_HEADER:raise Error('close_data at wrong time')if self.dlen:dummy = self._read(self.dlen)self._checkcrc()self.state = _DID_DATAdef read_rsrc(self, *n):if self.state == _DID_HEADER:self.close_data()if self.state != _DID_DATA:raise Error('Read resource data at wrong time')if n:n = n[0]n = min(n, self.rlen)else:n = self.rlenself.rlen = self.rlen - nreturn self._read(n)def close(self):if self.state is None:returntry:if self.rlen:dummy = self.read_rsrc(self.rlen)self._checkcrc()finally:self.state = Noneself.ifp.close()def hexbin(inp, out):"""hexbin(infilename, outfilename) - Decode binhexed file"""ifp = HexBin(inp)finfo = ifp.FInfoif not out:out = ifp.FNamewith io.open(out, 'wb') as ofp:# XXXX Do translation on non-mac systemswhile True:d = ifp.read(128000)if not d: breakofp.write(d)ifp.close_data()d = ifp.read_rsrc(128000)if d:ofp = openrsrc(out, 'wb')ofp.write(d)while True:d = ifp.read_rsrc(128000)if not d: breakofp.write(d)ofp.close()ifp.close()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。