base58_alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
-def base58_encode(data):
- return base58_alphabet[0]*(len(data) - len(data.lstrip(chr(0)))) + bases.natural_to_string(bases.string_to_natural(data), base58_alphabet)
+def base58_encode(bindata):
+ bindata2 = bindata.lstrip(chr(0))
+ return base58_alphabet[0]*(len(bindata) - len(bindata2)) + bases.natural_to_string(bases.string_to_natural(bindata2), base58_alphabet)
-def base58_decode(data):
- return chr(0)*(len(data) - len(data.lstrip(base58_alphabet[0]))) + bases.natural_to_string(bases.string_to_natural(data, base58_alphabet))
+def base58_decode(b58data):
+ b58data2 = b58data.lstrip(base58_alphabet[0])
+ return chr(0)*(len(b58data) - len(b58data2)) + bases.natural_to_string(bases.string_to_natural(b58data2, base58_alphabet))
def protoPUSHDATA(size_len):
def _(f):
length_str, f = bitcoin_data.read(f, size_len)
- length = bases.string_to_natural(length_str[::-1])
+ length = bases.string_to_natural(length_str[::-1].lstrip(chr(0)))
data, f = bitcoin_data.read(f, length)
return data, f
return _
s = bases.natural_to_string(n, alphabet)
n2 = bases.string_to_natural(s, alphabet)
#print n, s.encode('hex'), n2
- assert n == n2
+ self.assertEquals(n, n2)
def natural_to_string(n, alphabet=None):
+ if n < 0:
+ raise TypeError('n must be a natural')
if alphabet is None:
s = '%x' % (n,)
if len(s) % 2:
s = '0' + s
- return s.decode('hex').lstrip('\x00')
+ return s.decode('hex')
else:
assert len(set(alphabet)) == len(alphabet)
res = []
def string_to_natural(s, alphabet=None):
if alphabet is None:
- #if s.startswith('\x00'):
- # raise ValueError()
- return int('0' + s.encode('hex'), 16)
+ assert not s.startswith('\x00')
+ return int(s.encode('hex'), 16) if s else 0
else:
assert len(set(alphabet)) == len(alphabet)
- #if s.startswith(alphabet[0]):
- # raise ValueError()
+ assert not s.startswith(alphabet[0])
return sum(alphabet.index(char) * len(alphabet)**i for i, char in enumerate(reversed(s)))