长< - > str二进制转换

时间:2008-11-30 15:40:58

标签: python string bignum

是否有任何lib将非常长的数字转换为只复制数据的字符串?

这些单行太慢了:

def xlong(s):
    return sum([ord(c) << e*8 for e,c in enumerate(s)])

def xstr(x):
    return chr(x&255) + xstr(x >> 8) if x else ''

print xlong('abcd'*1024) % 666
print xstr(13**666)

6 个答案:

答案 0 :(得分:4)

你想要结构模块。

packed = struct.pack('l', 123456)
assert struct.unpack('l', packed)[0] == 123456

答案 1 :(得分:2)

怎么样

from binascii import hexlify, unhexlify

def xstr(x):
    hex = '%x' % x
    return unhexlify('0'*(len(hex)%2) + hex)[::-1]

def xlong(s):
    return int(hexlify(s[::-1]), 16)

我没有时间,但它应该更快,也适用于更大的数字,因为它不使用递归。

答案 2 :(得分:2)

事实上,我缺乏长(s,256)。我潜伏更多,看到Python CAPI文件“longobject.h”中有2个函数:

PyObject * _PyLong_FromByteArray( const unsigned char* bytes, size_t n, int little_endian, int is_signed);
int _PyLong_AsByteArray(PyLongObject* v, unsigned char* bytes, size_t n, int little_endian, int is_signed);

他们完成这项工作。我不知道为什么没有包含在某些python模块中,或者如果我错了就纠正我。

答案 3 :(得分:1)

如果需要快速序列化,请使用marshal模块。它比你的方法快了大约400倍。

答案 4 :(得分:0)

我猜你不关心字符串格式,你只想要序列化?如果是这样,为什么不使用Python的内置序列化程序cPickle模块? dumps函数会将包含长整数的任何python对象转换为字符串,loads函数则反转。如果您要保存到文件,请查看dumpload功能。

>>> import cPickle
>>> print cPickle.loads(cPickle.dumps(13**666)) % 666
73
>>> print (13**666) % 666
73

答案 5 :(得分:-1)

cPicklemarshal的性能(Python 2.5.2,Windows):

python -mtimeit -s"from cPickle import loads,dumps;d=13**666" "loads(dumps(d))"
1000 loops, best of 3: 600 usec per loop

python -mtimeit -s"from marshal import loads,dumps;d=13**666" "loads(dumps(d))"
100000 loops, best of 3: 7.79 usec per loop

python -mtimeit -s"from pickle import loads,dumps;d= 13**666" "loads(dumps(d))"
1000 loops, best of 3: 644 usec per loop

marshal要快得多。