1
sillyousu 2013-06-04 07:06:57 +08:00 via Android
这个256位的大数一定要变成一个bytes?
如果可以变几个bytes的话,struct那里多放几个I行不? |
2
zuroc 2013-06-04 07:24:06 +08:00
In [10]: msgpack.dumps(2**64-1)
Out[10]: '\xcf\xff\xff\xff\xff\xff\xff\xff\xff' In [11]: msgpack.dumps(2**64-1) Out[11]: '\xcf\xff\xff\xff\xff\xff\xff\xff\xff' In [12]: msgpack.dumps(1) Out[12]: '\x01' In [13]: msgpack.dumps(2) Out[13]: '\x02' In [14]: msgpack.dumps(0) Out[14]: '\x00' |
3
y0 OP @zuroc >>> msgpack.dumps(2078388773771218783740288990824871144635246987129597257065)
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "_packer.pyx", line 259, in msgpack._packer.packb (msgpack/_packer.cpp:259) File "_packer.pyx", line 184, in msgpack._packer.Packer.pack (msgpack/_packer.cpp:184) File "_packer.pyx", line 124, in msgpack._packer.Packer._pack (msgpack/_packer.cpp:124) OverflowError: int too big to convert |
4
zuroc 2013-06-04 08:10:09 +08:00
max 2**64-1
|
6
lyjyiran 2013-06-04 08:30:26 +08:00
>>> val=2078388773771218783740288990824871144635246987129597257065
>>> bytes = hex(val).rstrip('L')[2:].decode('hex') >>> bytes 'T\xc3d+\x1bq\x8d\x7f\xb0\x12\xdf\xea\x1fd\x04\x14\xbbwG\xd6\xd1\xc8\xe5i' >>> int(bytes.encode('hex'),16) 2078388773771218783740288990824871144635246987129597257065L |
7
clowwindy 2013-06-04 09:45:36 +08:00 via iPhone
一个循环就搞定的事,何必这样呢
|
10
zuroc 2013-06-04 12:13:07 +08:00
In [5]: marshal.dumps(22222222222222222222222222222222222222222)
Out[5]: 'l\t\x00\x00\x00\x8ecq\x1c\x8e3\xd1"\xf6\x1e5J\xfa\x08)\x12NA' In [6]: marshal.dumps(22222222222222222222222222222222222222222222222222) Out[6]: 'l\x0b\x00\x00\x00\x8ecq\x1c\x8ec\xb1Pi<AG\xb5\x0b\x0f6Yp\xd0}\xd1<' In [7]: marshal.dumps(2222222222222222222222222222222222222222222222222222222222222222) Out[7]: "l\x0f\x00\x00\x00\x8ecq\x1c\x8ecq\x1c\xae\n\x0f\n'i6?\x18\n'u\xa5Y\x11G\xcbF\xdc,\x01\x00" |
11
y0 OP @zuroc 好像字节序是反的……
>>> binascii.unhexlify(hex(a).lstrip('0x')) b'2\x8a\xd9' >>> marshal.dumps(a) b'i\xd9\x8a2\x00' |
12
ruoyu0088 2013-06-09 16:58:57 +08:00
Python3的话可以用int的to_bytes()方法。
In [14]: a = 3**100 a.to_bytes(a.bit_length()//8 + 1, "little") Out[14]: b'\xd1\x138\xcfU}\x94\xd6u\xf7A[Vh7g\xcaSFZ' |
13
y0 OP @ruoyu0088 嗯,昨天才学会这个。不过这个必须 20 bytes 以内。
现在用的是 def to_bytes(u_int,length): return bitstring.BitArray(uint=u_int,length=length).bytes |
14
xierch 2013-06-09 17:21:36 +08:00 1
还是直接点写循环吧.. 何必纠结于一行,效率反而低了..
i = 2078388773771218783740288990824871144635246987129597257065 s = '' while i: s = chr(i & 255) + s i = i >> 8 |
15
ruoyu0088 2013-06-09 19:42:26 +08:00 1
@y0 没有20bytes的限制,例如:
In [7]: a = 3 ** 500 a.to_bytes(200, "little") Out[7]: b'\x11\xdd\xd97\xdbq\x0f\xcfg|t9R\xca\x03Z\x8cj\x10\x0e\x83\xd9W\x03\xa7\xb9\x9f\x91\xfd\xfc\x9a\xe2\xe5\x80u\xd0\xe7\x9fv\x88\xb7W\xf8h\xc7\xdeg\x10\xd7\x8b\xa2u(`u?)\xc1\x06\x82l\x10\xf6R\xcc\x8b\x16\xa6\xda\x8d\xdf\xee\xbfq\xfc\x07`\xb3D\xbaA\x8dzq\x18\xbd\xa8nS8\xe4\x04v?V\xe0,]e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |