String-Bytes distinction (first attempt).

pull/1/head
Yusuke Shinyama 2014-06-30 19:05:56 +09:00
parent 8791355e1d
commit 1ccfaff411
16 changed files with 174 additions and 174 deletions

View File

@ -12,11 +12,11 @@ This code is in the public domain.
class Arcfour(object):
"""
>>> Arcfour('Key').process('Plaintext').encode('hex')
>>> Arcfour(b'Key').process(b'Plaintext').encode('hex')
'bbf316e8d940af0ad3'
>>> Arcfour('Wiki').process('pedia').encode('hex')
>>> Arcfour(b'Wiki').process(b'pedia').encode('hex')
'1021bf0420'
>>> Arcfour('Secret').process('Attack at dawn').encode('hex')
>>> Arcfour(b'Secret').process(b'Attack at dawn').encode('hex')
'45a01f645fc35b383552544b9bf5'
"""
@ -34,7 +34,7 @@ class Arcfour(object):
def process(self, data):
(i, j) = (self.i, self.j)
s = self.s
r = ''
r = b''
for c in data:
i = (i+1) % 256
j = (j+s[i]) % 256

View File

@ -24,24 +24,24 @@ def ascii85decode(data):
The sample string is taken from:
http://en.wikipedia.org/w/index.php?title=Ascii85
>>> ascii85decode('9jqo^BlbD-BleB1DJ+*+F(f,q')
>>> ascii85decode(b'9jqo^BlbD-BleB1DJ+*+F(f,q')
'Man is distinguished'
>>> ascii85decode('E,9)oF*2M7/c~>')
>>> ascii85decode(b'E,9)oF*2M7/c~>')
'pleasure.'
"""
n = b = 0
out = ''
out = b''
for c in data:
if '!' <= c and c <= 'u':
if b'!' <= c and c <= b'u':
n += 1
b = b*85+(ord(c)-33)
if n == 5:
out += struct.pack('>L', b)
n = b = 0
elif c == 'z':
elif c == b'z':
assert n == 0
out += '\0\0\0\0'
elif c == '~':
out += b'\0\0\0\0'
elif c == b'~':
if n:
for _ in range(5-n):
b = b*85+84
@ -64,19 +64,19 @@ def asciihexdecode(data):
the EOD marker after reading an odd number of hexadecimal digits, it
will behave as if a 0 followed the last digit.
>>> asciihexdecode('61 62 2e6364 65')
>>> asciihexdecode(b'61 62 2e6364 65')
'ab.cde'
>>> asciihexdecode('61 62 2e6364 657>')
>>> asciihexdecode(b'61 62 2e6364 657>')
'ab.cdep'
>>> asciihexdecode('7>')
>>> asciihexdecode(b'7>')
'p'
"""
decode = (lambda hx: chr(int(hx, 16)))
out = map(decode, hex_re.findall(data))
m = trail_re.search(data)
if m:
out.append(decode("%c0" % m.group(1)))
return ''.join(out)
out.append(decode('%c0' % m.group(1)))
return b''.join(out)
if __name__ == '__main__':

View File

@ -691,7 +691,7 @@ class CCITTFaxDecoder(CCITTG4Parser):
def __init__(self, width, bytealign=False, reversed=False):
CCITTG4Parser.__init__(self, width, bytealign=bytealign)
self.reversed = reversed
self._buf = ''
self._buf = b''
return
def close(self):

View File

@ -237,7 +237,7 @@ class CMapDB(object):
if os.path.exists(path):
gzfile = gzip.open(path)
try:
return type(name, (), pickle.loads(gzfile.read()))
return type(str(name), (), pickle.loads(gzfile.read()))
finally:
gzfile.close()
else:
@ -288,17 +288,17 @@ class CMapParser(PSStackParser):
def do_keyword(self, pos, token):
name = token.name
if name == 'begincmap':
if name == b'begincmap':
self._in_cmap = True
self.popall()
return
elif name == 'endcmap':
elif name == b'endcmap':
self._in_cmap = False
return
if not self._in_cmap:
return
#
if name == 'def':
if name == b'def':
try:
((_, k), (_, v)) = self.pop(2)
self.cmap.set_attr(literal_name(k), v)
@ -306,7 +306,7 @@ class CMapParser(PSStackParser):
pass
return
if name == 'usecmap':
if name == b'usecmap':
try:
((_, cmapname),) = self.pop(1)
self.cmap.use_cmap(CMapDB.get_cmap(literal_name(cmapname)))
@ -316,17 +316,17 @@ class CMapParser(PSStackParser):
pass
return
if name == 'begincodespacerange':
if name == b'begincodespacerange':
self.popall()
return
if name == 'endcodespacerange':
if name == b'endcodespacerange':
self.popall()
return
if name == 'begincidrange':
if name == b'begincidrange':
self.popall()
return
if name == 'endcidrange':
if name == b'endcidrange':
objs = [obj for (__, obj) in self.popall()]
for (s, e, cid) in choplist(3, objs):
if (not isinstance(s, str) or not isinstance(e, str) or
@ -347,20 +347,20 @@ class CMapParser(PSStackParser):
self.cmap.add_code2cid(x, cid+i)
return
if name == 'begincidchar':
if name == b'begincidchar':
self.popall()
return
if name == 'endcidchar':
if name == b'endcidchar':
objs = [obj for (__, obj) in self.popall()]
for (cid, code) in choplist(2, objs):
if isinstance(code, str) and isinstance(cid, str):
self.cmap.add_code2cid(code, nunpack(cid))
return
if name == 'beginbfrange':
if name == b'beginbfrange':
self.popall()
return
if name == 'endbfrange':
if name == b'endbfrange':
objs = [obj for (__, obj) in self.popall()]
for (s, e, code) in choplist(3, objs):
if (not isinstance(s, str) or not isinstance(e, str) or
@ -382,20 +382,20 @@ class CMapParser(PSStackParser):
self.cmap.add_cid2unichr(s1+i, x)
return
if name == 'beginbfchar':
if name == b'beginbfchar':
self.popall()
return
if name == 'endbfchar':
if name == b'endbfchar':
objs = [obj for (__, obj) in self.popall()]
for (cid, code) in choplist(2, objs):
if isinstance(cid, str) and isinstance(code, str):
self.cmap.add_cid2unichr(nunpack(cid), code)
return
if name == 'beginnotdefrange':
if name == b'beginnotdefrange':
self.popall()
return
if name == 'endnotdefrange':
if name == b'endnotdefrange':
self.popall()
return

View File

@ -35,7 +35,7 @@ class BMPWriter(object):
headersize = 14+40+ncols*4
info = struct.pack('<IiiHHIIIIII', 40, self.width, self.height, 1, self.bits, 0, self.datasize, 0, 0, ncols, 0)
assert len(info) == 40, len(info)
header = struct.pack('<ccIHHI', 'B', 'M', headersize+self.datasize, 0, 0, headersize)
header = struct.pack('<ccIHHI', b'B', b'M', headersize+self.datasize, 0, 0, headersize)
assert len(header) == 14, len(header)
self.fp.write(header)
self.fp.write(info)

View File

@ -45,12 +45,12 @@ class LZWDecoder(object):
return v
def feed(self, code):
x = ''
x = b''
if code == 256:
self.table = [chr(c) for c in xrange(256)] # 0-255
self.table.append(None) # 256
self.table.append(None) # 257
self.prevbuf = ''
self.prevbuf = b''
self.nbits = 9
elif code == 257:
pass
@ -95,11 +95,11 @@ class LZWDecoder(object):
# lzwdecode
def lzwdecode(data):
"""
>>> lzwdecode('\x80\x0b\x60\x50\x22\x0c\x0c\x85\x01')
>>> lzwdecode(b'\x80\x0b\x60\x50\x22\x0c\x0c\x85\x01')
'\x2d\x2d\x2d\x2d\x2d\x41\x2d\x2d\x2d\x42'
"""
fp = BytesIO(data)
return ''.join(LZWDecoder(fp).run())
return b''.join(LZWDecoder(fp).run())
if __name__ == '__main__':
import doctest

View File

@ -100,10 +100,10 @@ class PDFXRef(PDFBaseXRef):
raise PDFNoValidXRef('Unexpected EOF - file corrupted?')
if not line:
raise PDFNoValidXRef('Premature eof: %r' % parser)
if line.startswith('trailer'):
if line.startswith(b'trailer'):
parser.seek(pos)
break
f = line.strip().split(' ')
f = line.strip().split(b' ')
if len(f) != 2:
raise PDFNoValidXRef('Trailer not found: %r: line=%r' % (parser, line))
try:
@ -115,11 +115,11 @@ class PDFXRef(PDFBaseXRef):
(_, line) = parser.nextline()
except PSEOF:
raise PDFNoValidXRef('Unexpected EOF - file corrupted?')
f = line.strip().split(' ')
f = line.strip().split(b' ')
if len(f) != 3:
raise PDFNoValidXRef('Invalid XRef format: %r, line=%r' % (parser, line))
(pos, genno, use) = f
if use != 'n':
if use != b'n':
continue
self.offsets[objid] = (None, long(pos), int(genno))
logging.info('xref objects: %r' % self.offsets)
@ -170,7 +170,7 @@ class PDFXRefFallback(PDFXRef):
(pos, line) = parser.nextline()
except PSEOF:
break
if line.startswith('trailer'):
if line.startswith(b'trailer'):
parser.seek(pos)
self.load_trailer(parser)
logging.info('trailer: %r' % self.get_trailer())
@ -284,10 +284,10 @@ class PDFXRefStream(PDFBaseXRef):
##
class PDFStandardSecurityHandler(object):
PASSWORD_PADDING = '(\xbfN^Nu\x8aAd\x00NV\xff\xfa\x01\x08..\x00\xb6\xd0h>\x80/\x0c\xa9\xfedSiz'
PASSWORD_PADDING = b'(\xbfN^Nu\x8aAd\x00NV\xff\xfa\x01\x08..\x00\xb6\xd0h>\x80/\x0c\xa9\xfedSiz'
supported_revisions = (2, 3)
def __init__(self, docid, param, password=''):
def __init__(self, docid, param, password=b''):
self.docid = docid
self.param = param
self.password = password
@ -331,7 +331,7 @@ class PDFStandardSecurityHandler(object):
hash.update(self.docid[0]) # 3
result = ARC4.new(key).encrypt(hash.digest()) # 4
for i in range(1, 20): # 5
k = ''.join(chr(ord(c) ^ i) for c in key)
k = b''.join(chr(ord(c) ^ i) for c in key)
result = ARC4.new(k).encrypt(result)
result += result # 6
return result
@ -345,7 +345,7 @@ class PDFStandardSecurityHandler(object):
hash.update(self.docid[0]) # 5
if self.r >= 4:
if not self.encrypt_metadata:
hash.update('\xff\xff\xff\xff')
hash.update(b'\xff\xff\xff\xff')
result = hash.digest()
n = 5
if self.r >= 3:
@ -388,7 +388,7 @@ class PDFStandardSecurityHandler(object):
else:
user_password = self.o
for i in range(19, -1, -1):
k = ''.join(chr(ord(c) ^ i) for c in key)
k = b''.join(chr(ord(c) ^ i) for c in key)
user_password = ARC4.new(k).decrypt(user_password)
return self.authenticate_user_password(user_password)
@ -444,7 +444,7 @@ class PDFStandardSecurityHandlerV4(PDFStandardSecurityHandler):
return data
def decrypt_aes128(self, objid, genno, data):
key = self.key + struct.pack('<L', objid)[:3] + struct.pack('<L', genno)[:2] + "sAlT"
key = self.key + struct.pack('<L', objid)[:3] + struct.pack('<L', genno)[:2] + b'sAlT'
hash = md5.md5(key)
key = hash.digest()[:min(len(key), 16)]
return AES.new(key, mode=AES.MODE_CBC, IV=data[:16]).decrypt(data[16:])
@ -479,13 +479,13 @@ class PDFStandardSecurityHandlerV5(PDFStandardSecurityHandlerV4):
hash = SHA256.new(password)
hash.update(self.o_key_salt)
hash.update(self.u)
return AES.new(hash.digest(), mode=AES.MODE_CBC, IV='\x00' * 16).decrypt(self.oe)
return AES.new(hash.digest(), mode=AES.MODE_CBC, IV=b'\x00' * 16).decrypt(self.oe)
hash = SHA256.new(password)
hash.update(self.u_validation_salt)
if hash.digest() == self.u_hash:
hash = SHA256.new(password)
hash.update(self.u_key_salt)
return AES.new(hash.digest(), mode=AES.MODE_CBC, IV='\x00' * 16).decrypt(self.ue)
return AES.new(hash.digest(), mode=AES.MODE_CBC, IV=b'\x00' * 16).decrypt(self.ue)
def decrypt_aes256(self, objid, genno, data):
return AES.new(self.key, mode=AES.MODE_CBC, IV=data[:16]).decrypt(data[16:])
@ -517,7 +517,7 @@ class PDFDocument(object):
security_handler_registry[5] = PDFStandardSecurityHandlerV5
debug = 0
def __init__(self, parser, password='', caching=True, fallback=True):
def __init__(self, parser, password=b'', caching=True, fallback=True):
"Set the document to use a given PDFParser object."
self.caching = caching
self.xrefs = []
@ -566,9 +566,9 @@ class PDFDocument(object):
raise PDFSyntaxError('Catalog not found!')
return
# _initialize_password(password='')
# _initialize_password(password=b'')
# Perform the initialization with a given password.
def _initialize_password(self, password=''):
def _initialize_password(self, password=b''):
(docid, param) = self.encryption
if literal_name(param.get('Filter')) != 'Standard':
raise PDFEncryptionError('Unknown filter: param=%r' % param)
@ -740,7 +740,7 @@ class PDFDocument(object):
line = line.strip()
if self.debug:
logging.debug('find_xref: %r' % line)
if line == 'startxref':
if line == b'startxref':
break
if line:
prev = line

View File

@ -88,15 +88,15 @@ class FontMetricsDB(object):
##
class Type1FontHeaderParser(PSStackParser):
KEYWORD_BEGIN = KWD('begin')
KEYWORD_END = KWD('end')
KEYWORD_DEF = KWD('def')
KEYWORD_PUT = KWD('put')
KEYWORD_DICT = KWD('dict')
KEYWORD_ARRAY = KWD('array')
KEYWORD_READONLY = KWD('readonly')
KEYWORD_FOR = KWD('for')
KEYWORD_FOR = KWD('for')
KEYWORD_BEGIN = KWD(b'begin')
KEYWORD_END = KWD(b'end')
KEYWORD_DEF = KWD(b'def')
KEYWORD_PUT = KWD(b'put')
KEYWORD_DICT = KWD(b'dict')
KEYWORD_ARRAY = KWD(b'array')
KEYWORD_READONLY = KWD(b'readonly')
KEYWORD_FOR = KWD(b'for')
KEYWORD_FOR = KWD(b'for')
def __init__(self, data):
PSStackParser.__init__(self, data)
@ -311,13 +311,13 @@ class CFFFont(object):
self.gid2code = {}
self.fp.seek(encoding_pos)
format = self.fp.read(1)
if format == '\x00':
if format == b'\x00':
# Format 0
(n,) = struct.unpack('B', self.fp.read(1))
for (code, gid) in enumerate(struct.unpack('B'*n, self.fp.read(n))):
self.code2gid[code] = gid
self.gid2code[gid] = code
elif format == '\x01':
elif format == b'\x01':
# Format 1
(n,) = struct.unpack('B', self.fp.read(1))
code = 0
@ -334,7 +334,7 @@ class CFFFont(object):
self.gid2name = {}
self.fp.seek(charset_pos)
format = self.fp.read(1)
if format == '\x00':
if format == b'\x00':
# Format 0
n = self.nglyphs-1
for (gid, sid) in enumerate(struct.unpack('>'+'H'*n, self.fp.read(2*n))):
@ -342,7 +342,7 @@ class CFFFont(object):
name = self.getstr(sid)
self.name2gid[name] = gid
self.gid2name[gid] = name
elif format == '\x01':
elif format == b'\x01':
# Format 1
(n,) = struct.unpack('B', self.fp.read(1))
sid = 0
@ -353,7 +353,7 @@ class CFFFont(object):
self.name2gid[name] = gid
self.gid2name[gid] = name
sid += 1
elif format == '\x02':
elif format == b'\x02':
# Format 2
assert 0
else:

View File

@ -246,10 +246,10 @@ class PDFContentParser(PSStackParser):
self.charpos = 0
return
def get_inline_data(self, pos, target='EI'):
def get_inline_data(self, pos, target=b'EI'):
self.seek(pos)
i = 0
data = ''
data = b''
while i <= len(target):
self.fillbuf()
if i:
@ -273,16 +273,16 @@ class PDFContentParser(PSStackParser):
data += self.buf[self.charpos:]
self.charpos = len(self.buf)
data = data[:-(len(target)+1)] # strip the last part
data = re.sub(r'(\x0d\x0a|[\x0d\x0a])$', '', data)
data = re.sub(br'(\x0d\x0a|[\x0d\x0a])$', b'', data)
return (pos, data)
def flush(self):
self.add_results(*self.popall())
return
KEYWORD_BI = KWD('BI')
KEYWORD_ID = KWD('ID')
KEYWORD_EI = KWD('EI')
KEYWORD_BI = KWD(b'BI')
KEYWORD_ID = KWD(b'ID')
KEYWORD_EI = KWD(b'EI')
def do_keyword(self, pos, token):
if token is self.KEYWORD_BI:
@ -294,7 +294,7 @@ class PDFContentParser(PSStackParser):
if len(objs) % 2 != 0:
raise PSTypeError('Invalid dictionary construct: %r' % objs)
d = dict((literal_name(k), v) for (k, v) in choplist(2, objs))
(pos, data) = self.get_inline_data(pos+len('ID '))
(pos, data) = self.get_inline_data(pos+len(b'ID '))
obj = PDFStream(d, data)
self.push((pos, obj))
self.push((pos, self.KEYWORD_EI))

View File

@ -112,7 +112,7 @@ class PDFPage(object):
@classmethod
def get_pages(klass, fp,
pagenos=None, maxpages=0, password='',
pagenos=None, maxpages=0, password=b'',
caching=True, check_extractable=True):
# Create a PDF parser object associated with the file object.
parser = PDFParser(fp)

View File

@ -50,12 +50,12 @@ class PDFParser(PSStackParser):
self.doc = doc
return
KEYWORD_R = KWD('R')
KEYWORD_NULL = KWD('null')
KEYWORD_ENDOBJ = KWD('endobj')
KEYWORD_STREAM = KWD('stream')
KEYWORD_XREF = KWD('xref')
KEYWORD_STARTXREF = KWD('startxref')
KEYWORD_R = KWD(b'R')
KEYWORD_NULL = KWD(b'null')
KEYWORD_ENDOBJ = KWD(b'endobj')
KEYWORD_STREAM = KWD(b'stream')
KEYWORD_XREF = KWD(b'xref')
KEYWORD_STARTXREF = KWD(b'startxref')
def do_keyword(self, pos, token):
"""Handles PDF-related keywords."""
@ -109,8 +109,8 @@ class PDFParser(PSStackParser):
if STRICT:
raise PDFSyntaxError('Unexpected EOF')
break
if 'endstream' in line:
i = line.index('endstream')
if b'endstream' in line:
i = line.index(b'endstream')
objlen += i
if self.fallback:
data += line[:i]
@ -153,7 +153,7 @@ class PDFStreamParser(PDFParser):
self.add_results(*self.popall())
return
KEYWORD_OBJ = KWD('obj')
KEYWORD_OBJ = KWD(b'obj')
def do_keyword(self, pos, token):
if token is self.KEYWORD_R:
# reference to indirect object
@ -169,7 +169,7 @@ class PDFStreamParser(PDFParser):
if STRICT:
# See PDF Spec 3.4.6: Only the object values are stored in the
# stream; the obj and endobj keywords are not used.
raise PDFSyntaxError("Keyword endobj found in stream")
raise PDFSyntaxError('Keyword endobj found in stream')
return
# others
self.push((pos, token))

View File

@ -244,7 +244,7 @@ class PDFStream(PDFObject):
except zlib.error as e:
if STRICT:
raise PDFException('Invalid zlib bytes: %r, %r' % (e, data))
data = ''
data = b''
elif f in LITERALS_LZW_DECODE:
data = lzwdecode(data)
elif f in LITERALS_ASCII85_DECODE:

View File

@ -111,12 +111,12 @@ PSLiteralTable = PSSymbolTable(PSLiteral)
PSKeywordTable = PSSymbolTable(PSKeyword)
LIT = PSLiteralTable.intern
KWD = PSKeywordTable.intern
KEYWORD_PROC_BEGIN = KWD('{')
KEYWORD_PROC_END = KWD('}')
KEYWORD_ARRAY_BEGIN = KWD('[')
KEYWORD_ARRAY_END = KWD(']')
KEYWORD_DICT_BEGIN = KWD('<<')
KEYWORD_DICT_END = KWD('>>')
KEYWORD_PROC_BEGIN = KWD(b'{')
KEYWORD_PROC_END = KWD(b'}')
KEYWORD_ARRAY_BEGIN = KWD(b'[')
KEYWORD_ARRAY_END = KWD(b']')
KEYWORD_DICT_BEGIN = KWD(b'<<')
KEYWORD_DICT_END = KWD(b'>>')
def literal_name(x):
@ -139,18 +139,18 @@ def keyword_name(x):
## PSBaseParser
##
EOL = re.compile(r'[\r\n]')
SPC = re.compile(r'\s')
NONSPC = re.compile(r'\S')
HEX = re.compile(r'[0-9a-fA-F]')
END_LITERAL = re.compile(r'[#/%\[\]()<>{}\s]')
END_HEX_STRING = re.compile(r'[^\s0-9a-fA-F]')
HEX_PAIR = re.compile(r'[0-9a-fA-F]{2}|.')
END_NUMBER = re.compile(r'[^0-9]')
END_KEYWORD = re.compile(r'[#/%\[\]()<>{}\s]')
END_STRING = re.compile(r'[()\134]')
OCT_STRING = re.compile(r'[0-7]')
ESC_STRING = {'b': 8, 't': 9, 'n': 10, 'f': 12, 'r': 13, '(': 40, ')': 41, '\\': 92}
EOL = re.compile(br'[\r\n]')
SPC = re.compile(br'\s')
NONSPC = re.compile(br'\S')
HEX = re.compile(br'[0-9a-fA-F]')
END_LITERAL = re.compile(br'[#/%\[\]()<>{}\s]')
END_HEX_STRING = re.compile(br'[^\s0-9a-fA-F]')
HEX_PAIR = re.compile(br'[0-9a-fA-F]{2}|.')
END_NUMBER = re.compile(br'[^0-9]')
END_KEYWORD = re.compile(br'[#/%\[\]()<>{}\s]')
END_STRING = re.compile(br'[()\134]')
OCT_STRING = re.compile(br'[0-7]')
ESC_STRING = {b'b': 8, b't': 9, b'n': 10, b'f': 12, b'r': 13, b'(': 40, b')': 41, b'\\': 92}
class PSBaseParser(object):
@ -196,11 +196,11 @@ class PSBaseParser(object):
self.fp.seek(pos)
# reset the status for nextline()
self.bufpos = pos
self.buf = ''
self.buf = b''
self.charpos = 0
# reset the status for nexttoken()
self._parse1 = self._parse_main
self._curtoken = ''
self._curtoken = b''
self._curtokenpos = 0
self._tokens = []
return
@ -219,15 +219,15 @@ class PSBaseParser(object):
def nextline(self):
"""Fetches a next line that ends either with \\r or \\n.
"""
linebuf = ''
linebuf = b''
linepos = self.bufpos + self.charpos
eol = False
while 1:
self.fillbuf()
if eol:
c = self.buf[self.charpos]
# handle '\r\n'
if c == '\n':
# handle b'\r\n'
if c == b'\n':
linebuf += c
self.charpos += 1
break
@ -235,7 +235,7 @@ class PSBaseParser(object):
if m:
linebuf += self.buf[self.charpos:m.end(0)]
self.charpos = m.end(0)
if linebuf[-1] == '\r':
if linebuf[-1] == b'\r':
eol = True
else:
break
@ -253,7 +253,7 @@ class PSBaseParser(object):
"""
self.fp.seek(0, 2)
pos = self.fp.tell()
buf = ''
buf = b''
while 0 < pos:
prevpos = pos
pos = max(0, pos-self.BUFSIZ)
@ -262,13 +262,13 @@ class PSBaseParser(object):
if not s:
break
while 1:
n = max(s.rfind('\r'), s.rfind('\n'))
n = max(s.rfind(b'\r'), s.rfind(b'\n'))
if n == -1:
buf = s + buf
break
yield s[n:]+buf
s = s[:n]
buf = ''
buf = b''
return
def _parse_main(self, s, i):
@ -278,19 +278,19 @@ class PSBaseParser(object):
j = m.start(0)
c = s[j]
self._curtokenpos = self.bufpos+j
if c == '%':
self._curtoken = '%'
if c == b'%':
self._curtoken = b'%'
self._parse1 = self._parse_comment
return j+1
elif c == '/':
self._curtoken = ''
elif c == b'/':
self._curtoken = b''
self._parse1 = self._parse_literal
return j+1
elif c in '-+' or c.isdigit():
elif c in b'-+' or c.isdigit():
self._curtoken = c
self._parse1 = self._parse_number
return j+1
elif c == '.':
elif c == b'.':
self._curtoken = c
self._parse1 = self._parse_float
return j+1
@ -298,17 +298,17 @@ class PSBaseParser(object):
self._curtoken = c
self._parse1 = self._parse_keyword
return j+1
elif c == '(':
self._curtoken = ''
elif c == b'(':
self._curtoken = b''
self.paren = 1
self._parse1 = self._parse_string
return j+1
elif c == '<':
self._curtoken = ''
elif c == b'<':
self._curtoken = b''
self._parse1 = self._parse_wopen
return j+1
elif c == '>':
self._curtoken = ''
elif c == b'>':
self._curtoken = b''
self._parse1 = self._parse_wclose
return j+1
else:
@ -339,11 +339,11 @@ class PSBaseParser(object):
j = m.start(0)
self._curtoken += s[i:j]
c = s[j]
if c == '#':
self.hex = ''
if c == b'#':
self.hex = b''
self._parse1 = self._parse_literal_hex
return j+1
self._add_token(LIT(self._curtoken))
self._add_token(LIT(unicode(self._curtoken)))
self._parse1 = self._parse_main
return j
@ -365,7 +365,7 @@ class PSBaseParser(object):
j = m.start(0)
self._curtoken += s[i:j]
c = s[j]
if c == '.':
if c == b'.':
self._curtoken += c
self._parse1 = self._parse_float
return j+1
@ -397,9 +397,9 @@ class PSBaseParser(object):
return len(s)
j = m.start(0)
self._curtoken += s[i:j]
if self._curtoken == 'true':
if self._curtoken == b'true':
token = True
elif self._curtoken == 'false':
elif self._curtoken == b'false':
token = False
else:
token = KWD(self._curtoken)
@ -415,20 +415,20 @@ class PSBaseParser(object):
j = m.start(0)
self._curtoken += s[i:j]
c = s[j]
if c == '\\':
self.oct = ''
if c == b'\\':
self.oct = b''
self._parse1 = self._parse_string_1
return j+1
if c == '(':
if c == b'(':
self.paren += 1
self._curtoken += c
return j+1
if c == ')':
if c == b')':
self.paren -= 1
if self.paren: # WTF, they said balanced parens need no special treatment.
self._curtoken += c
return j+1
self._add_token(self._curtoken)
self._add_token(str(self._curtoken))
self._parse1 = self._parse_main
return j+1
@ -448,7 +448,7 @@ class PSBaseParser(object):
def _parse_wopen(self, s, i):
c = s[i]
if c == '<':
if c == b'<':
self._add_token(KEYWORD_DICT_BEGIN)
self._parse1 = self._parse_main
i += 1
@ -458,7 +458,7 @@ class PSBaseParser(object):
def _parse_wclose(self, s, i):
c = s[i]
if c == '>':
if c == b'>':
self._add_token(KEYWORD_DICT_END)
i += 1
self._parse1 = self._parse_main
@ -472,7 +472,7 @@ class PSBaseParser(object):
j = m.start(0)
self._curtoken += s[i:j]
token = HEX_PAIR.sub(lambda m: chr(int(m.group(0), 16)),
SPC.sub('', self._curtoken))
SPC.sub(b'', self._curtoken))
self._add_token(token)
self._parse1 = self._parse_main
return j
@ -616,7 +616,7 @@ import unittest
##
class TestPSBaseParser(unittest.TestCase):
TESTDATA = r'''%!PS
TESTDATA = br'''%!PS
begin end
" @ #
/a/BCD /Some_Name /foo#5f#xbaa
@ -637,18 +637,18 @@ func/a/b{(c)do*}def
'''
TOKENS = [
(5, KWD('begin')), (11, KWD('end')), (16, KWD('"')), (19, KWD('@')),
(21, KWD('#')), (23, LIT('a')), (25, LIT('BCD')), (30, LIT('Some_Name')),
(5, KWD(b'begin')), (11, KWD(b'end')), (16, KWD(b'"')), (19, KWD(b'@')),
(21, KWD(b'#')), (23, LIT('a')), (25, LIT('BCD')), (30, LIT('Some_Name')),
(41, LIT('foo_xbaa')), (54, 0), (56, 1), (59, -2), (62, 0.5),
(65, 1.234), (71, 'abc'), (77, ''), (80, 'abc ( def ) ghi'),
(98, 'def \x00 4ghi'), (118, 'bach\\slask'), (132, 'foo\nbaa'),
(143, 'this % is not a comment.'), (170, 'foo\nbaa'), (180, 'foobaa'),
(191, ''), (194, ' '), (199, '@@ '), (211, '\xab\xcd\x00\x124\x05'),
(226, KWD('func')), (230, LIT('a')), (232, LIT('b')),
(234, KWD('{')), (235, 'c'), (238, KWD('do*')), (241, KWD('}')),
(242, KWD('def')), (246, KWD('[')), (248, 1), (250, 'z'), (254, KWD('!')),
(256, KWD(']')), (258, KWD('<<')), (261, LIT('foo')), (266, 'bar'),
(272, KWD('>>'))
(65, 1.234), (71, b'abc'), (77, b''), (80, b'abc ( def ) ghi'),
(98, b'def \x00 4ghi'), (118, b'bach\\slask'), (132, b'foo\nbaa'),
(143, b'this % is not a comment.'), (170, b'foo\nbaa'), (180, b'foobaa'),
(191, b''), (194, b' '), (199, b'@@ '), (211, b'\xab\xcd\x00\x124\x05'),
(226, KWD(b'func')), (230, LIT('a')), (232, LIT('b')),
(234, KWD(b'{')), (235, b'c'), (238, KWD(b'do*')), (241, KWD(b'}')),
(242, KWD(b'def')), (246, KWD(b'[')), (248, 1), (250, b'z'), (254, KWD(b'!')),
(256, KWD(b']')), (258, KWD(b'<<')), (261, LIT('foo')), (266, b'bar'),
(272, KWD(b'>>'))
]
OBJS = [

View File

@ -898,7 +898,7 @@ def rijndaelEncrypt(rk, nrounds, plaintext):
Te3[(t2 ) & 0xff] ^
rk[p+3])
ciphertext = ''
ciphertext = b''
# apply last round and
# map cipher state to byte array block:
@ -1001,7 +1001,7 @@ def rijndaelDecrypt(rk, nrounds, ciphertext):
Td3[(t0 ) & 0xff] ^
rk[p+3])
plaintext = ''
plaintext = b''
# apply last round and
# map cipher state to byte array block:
@ -1042,8 +1042,8 @@ def rijndaelDecrypt(rk, nrounds, ciphertext):
class RijndaelDecryptor(object):
"""
>>> key = '00010203050607080a0b0c0d0f101112'.decode('hex')
>>> ciphertext = 'd8f532538289ef7d06b506a4fd5be9c9'.decode('hex')
>>> key = b'00010203050607080a0b0c0d0f101112'.decode('hex')
>>> ciphertext = b'd8f532538289ef7d06b506a4fd5be9c9'.decode('hex')
>>> RijndaelDecryptor(key, 128).decrypt(ciphertext).encode('hex')
'506812a45f08c889b97f5980038b8359'
"""
@ -1064,8 +1064,8 @@ class RijndaelDecryptor(object):
class RijndaelEncryptor(object):
"""
>>> key = '00010203050607080a0b0c0d0f101112'.decode('hex')
>>> plaintext = '506812a45f08c889b97f5980038b8359'.decode('hex')
>>> key = b'00010203050607080a0b0c0d0f101112'.decode('hex')
>>> plaintext = b'506812a45f08c889b97f5980038b8359'.decode('hex')
>>> RijndaelEncryptor(key, 128).encrypt(plaintext).encode('hex')
'd8f532538289ef7d06b506a4fd5be9c9'
"""

View File

@ -19,28 +19,28 @@ def rldecode(data):
129 to 255, the following single byte is to be copied 257 - length
(2 to 128) times during decompression. A length value of 128
denotes EOD.
>>> s = "\x05123456\xfa7\x04abcde\x80junk"
>>> s = b'\x05123456\xfa7\x04abcde\x80junk'
>>> rldecode(s)
'1234567777777abcde'
"""
decoded = []
i = 0
while i < len(data):
#print "data[%d]=:%d:" % (i,ord(data[i]))
#print 'data[%d]=:%d:' % (i,ord(data[i]))
length = ord(data[i])
if length == 128:
break
if length >= 0 and length < 128:
run = data[i+1:(i+1)+(length+1)]
#print "length=%d, run=%s" % (length+1,run)
#print 'length=%d, run=%s' % (length+1,run)
decoded.append(run)
i = (i+1) + (length+1)
if length > 128:
run = data[i+1]*(257-length)
#print "length=%d, run=%s" % (257-length,run)
#print 'length=%d, run=%s' % (257-length,run)
decoded.append(run)
i = (i+1) + 1
return ''.join(decoded)
return b''.join(decoded)
if __name__ == '__main__':

View File

@ -14,28 +14,28 @@ def apply_png_predictor(pred, colors, columns, bitspercomponent, data):
raise ValueError(bitspercomponent)
nbytes = colors*columns*bitspercomponent//8
i = 0
buf = ''
line0 = '\x00' * columns
buf = b''
line0 = b'\x00' * columns
for i in xrange(0, len(data), nbytes+1):
ft = data[i]
i += 1
line1 = data[i:i+nbytes]
line2 = ''
if ft == '\x00':
line2 = b''
if ft == b'\x00':
# PNG none
line2 += line1
elif ft == '\x01':
elif ft == b'\x01':
# PNG sub (UNTESTED)
c = 0
for b in line1:
c = (c+ord(b)) & 255
line2 += chr(c)
elif ft == '\x02':
elif ft == b'\x02':
# PNG up
for (a, b) in zip(line0, line1):
c = (ord(a)+ord(b)) & 255
line2 += chr(c)
elif ft == '\x03':
elif ft == b'\x03':
# PNG average (UNTESTED)
c = 0
for (a, b) in zip(line0, line1):
@ -176,7 +176,7 @@ def nunpack(s, default=0):
elif l == 2:
return struct.unpack('>H', s)[0]
elif l == 3:
return struct.unpack('>L', '\x00'+s)[0]
return struct.unpack('>L', b'\x00'+s)[0]
elif l == 4:
return struct.unpack('>L', s)[0]
else:
@ -222,7 +222,7 @@ PDFDocEncoding = ''.join(unichr(x) for x in (
def decode_text(s):
"""Decodes a PDFDocEncoding string to Unicode."""
if s.startswith('\xfe\xff'):
if s.startswith(b'\xfe\xff'):
return unicode(s[2:], 'utf-16be', 'ignore')
else:
return ''.join(PDFDocEncoding[ord(c)] for c in s)