无法转换从字节

问题描述:

诠释我的下一个值无法转换从字节

value = bytearray(b'\x85\x13\xbd|\xfb\xbc\xc3\x95\xbeL6L\xfa\xbf0U_`$]\xca\xee]z\xef\xa0\xd6(\x15\x8b\xca\x0e\x1f7\xa9\xf0\xa4\x98\xc5\xdf\xcdM5\xef\xc2\x052`\xeb\x13\xd9\x99B.\x95\xb2\xbd\x96\xd9\x14\xe6F\x9e\xfd\xd8\x00') 

当我尝试在python3.x转换效果很好。

>>> int.from_bytes(value, byteorder='little') 
2909369579440607969688280064437289348250138784421305732473112318543540722321676649649580720015118044118243611774710427666475769804427735898727217762490192773 

如何将其转换为python2.7?我已经阅读了convert a string of bytes into an int (python)

struct.unpack(fmt, value)[0] 

但是不知道如何处理fmt。

+0

你只是想要一个伟大的大数字表格呢? – LexyStardust

+0

是的,我想要。我无法想象我需要付出什么努力。这是价值的长度吗? – discort

+2

'struct.unpack'不适合你的情况,你有太多的字节。你想要http://stackoverflow.com/a/444814/8747 –

你可以只写你自己的from_bytes功能在Python 2:

def from_bytes (data, big_endian = False): 
    if isinstance(data, str): 
     data = bytearray(data) 
    if big_endian: 
     data = reversed(data) 
    num = 0 
    for offset, byte in enumerate(data): 
     num += byte << (offset * 8) 
    return num 

像这样来使用:

>>> data = b'\x85\x13\xbd|\xfb\xbc\xc3\x95\xbeL6L\xfa\xbf0U_`$]\xca\xee]z\xef\xa0\xd6(\x15\x8b\xca\x0e\x1f7\xa9\xf0\xa4\x98\xc5\xdf\xcdM5\xef\xc2\x052`\xeb\x13\xd9\x99B.\x95\xb2\xbd\x96\xd9\x14\xe6F\x9e\xfd\xd8\x00' 
>>> from_bytes(data) 
2909369579440607969688280064437289348250138784421305732473112318543540722321676649649580720015118044118243611774710427666475769804427735898727217762490192773L 

至于struct,你真的不能用这个,因为它仅支持开箱元素一个certain kind,最多8个字节的整数。但既然你想处理任意的字节字符串,你将不得不使用别的东西。

+0

谢谢。有用。 – discort

您可以使用.encode('hex')int(x, 16)组合:

num = int(str(value).encode('hex'), 16) 

请注意,你需要为了解析它作为端使用类似

参考https://stackoverflow.com/a/444814/8747

+0

请注意,您需要使用类似'int(''。join(reversed(value))。encode('hex'),16)'来解析它为* little * endian。 – poke

+0

谢谢。被盗。 –

+1

经过基准测试后,我发现这比我的解决方案更快得可笑,虽然这是解析字符串的...好的发现! – poke