Commit 3c703dfb authored by Alexandre Vassalotti's avatar Alexandre Vassalotti

Simplified long coding in pickle.py.

parent 34f637df
...@@ -1269,50 +1269,14 @@ def encode_long(x): ...@@ -1269,50 +1269,14 @@ def encode_long(x):
b'\x7f' b'\x7f'
>>> >>>
""" """
if x == 0: if x == 0:
return b'' return b''
if x > 0: nbytes = (x.bit_length() >> 3) + 1
ashex = hex(x) result = x.to_bytes(nbytes, byteorder='little', signed=True)
assert ashex.startswith("0x") if x < 0 and nbytes > 1:
njunkchars = 2 + ashex.endswith('L') if result[-1] == 0xff and (result[-2] & 0x80) != 0:
nibbles = len(ashex) - njunkchars result = result[:-1]
if nibbles & 1: return result
# need an even # of nibbles for unhexlify
ashex = "0x0" + ashex[2:]
elif int(ashex[2], 16) >= 8:
# "looks negative", so need a byte of sign bits
ashex = "0x00" + ashex[2:]
else:
# Build the 256's-complement: (1L << nbytes) + x. The trick is
# to find the number of bytes in linear time (although that should
# really be a constant-time task).
ashex = hex(-x)
assert ashex.startswith("0x")
njunkchars = 2 + ashex.endswith('L')
nibbles = len(ashex) - njunkchars
if nibbles & 1:
# Extend to a full byte.
nibbles += 1
nbits = nibbles * 4
x += 1 << nbits
assert x > 0
ashex = hex(x)
njunkchars = 2 + ashex.endswith('L')
newnibbles = len(ashex) - njunkchars
if newnibbles < nibbles:
ashex = "0x" + "0" * (nibbles - newnibbles) + ashex[2:]
if int(ashex[2], 16) < 8:
# "looks positive", so need a byte of sign bits
ashex = "0xff" + ashex[2:]
if ashex.endswith('L'):
ashex = ashex[2:-1]
else:
ashex = ashex[2:]
assert len(ashex) & 1 == 0, (x, ashex)
binary = _binascii.unhexlify(ashex)
return bytes(binary[::-1])
def decode_long(data): def decode_long(data):
r"""Decode a long from a two's complement little-endian binary string. r"""Decode a long from a two's complement little-endian binary string.
...@@ -1332,15 +1296,7 @@ def decode_long(data): ...@@ -1332,15 +1296,7 @@ def decode_long(data):
>>> decode_long(b"\x7f") >>> decode_long(b"\x7f")
127 127
""" """
return int.from_bytes(data, byteorder='little', signed=True)
nbytes = len(data)
if nbytes == 0:
return 0
ashex = _binascii.hexlify(data[::-1])
n = int(ashex, 16) # quadratic time before Python 2.3; linear now
if data[-1] >= 0x80:
n -= 1 << (nbytes * 8)
return n
# Use the faster _pickle if possible # Use the faster _pickle if possible
try: try:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment