2015-08-14 42 views
3

詮釋我的下一個值無法轉換從字節

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 –

回答

6

你可以只寫你自己的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

4

您可以使用.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

相關問題