2010-12-13 12 views
6

मैं निम्नलिखित स्ट्रिंग के लिए यह अहस्ताक्षरित पूर्णांक प्रतिनिधित्व है परिवर्तित कर रहा हूँ:इन बाइट्स को पायथन में int में बदलने के लिए सबसे छोटा तरीका?

str = '\x00\x00\x00\x00\x00\x00\x01\xFF'

मैं struct.unpack('8B', str) का उपयोग टपल प्रतिनिधित्व (0,0,0,0,0,0,1,255) प्राप्त करने के लिए कर सकते हैं, लेकिन क्या तेज/सबसे आसान तरीका है एक पूर्णांक को यह टपल कन्वर्ट करने के लिए है?

अभी, मेरे कोड

def unpack_str(s): 
    i = r = 0 
    for b in reversed(struct.unpack('8B', s)): 
    r += r*2**i 
    i++ 
    return r 

है लेकिन यह लंबी और बदसूरत, इस तरह के एक सरल समारोह के लिए है! इसके लिए अवश्य ही एक बेहतर तरीका होना चाहिए! क्या कोई एसओ पायथन गुरु मुझे इसे कम करने और पाइथन-इफ़ी को ट्रिम करने में मदद कर सकता है?

+0

श्श्श! आपका फ़ंक्शन हमेशा शून्य लौटाएगा! क्या आप देख सकते हैं क्यों? –

+0

इसके अलावा, 'i ++' अमान्य वाक्यविन्यास है (जैसा कि समान अर्थहीन के विपरीत है, लेकिन अधिक चुस्त '++ i' जो चलता है लेकिन कुछ भी नहीं करता है)। – delnan

उत्तर

6
>>> struct.unpack('>q', s)[0] 
511 
+0

बिल्कुल सही, धन्यवाद! – linked

0
def unpack_str(bytes): 
    return struct.unpack('<q',bytes) 

संरचना 8-बाइट लंबे लंबे समय तक सीधे निपट सकती है।

+0

उत्तर के लिए धन्यवाद, लेकिन व्यावहारिक रूप से, आपका "<" गलत लगता है (मुझे लाखों में जवाब देता है, मुझे लगता है कि यह एक हस्ताक्षरित लांगलांग के लिए है?) – linked

+1

@ लिंक्ड: '<' छोटे-एंडियन के लिए है (यानी सहीतम बिट सबसे महत्वपूर्ण है), '>' बड़े-एंडियन के लिए है (यानी बाएं सबसे बिट सबसे महत्वपूर्ण है)। 'q' के लिए है (हस्ताक्षरित) 'लंबे समय तक'। – delnan

2

बस एक लंबे (64-बिट पूर्णांक) के रूप में खोल:

struct.unpack('>Q', str) 

Q = अहस्ताक्षरित लंबे। 0 स्ट्रिंग पर लंबे समय तक हस्ताक्षर किए जाने पर q पर स्विच करें।

> बड़े-एंडियन बाइट ऑर्डर को इंगित करता है। छोटे-एंडियन बाइट ऑर्डर को इंगित करने के लिए < का उपयोग करें।

0

long and ugly टिप्पणी से सहमत होना चाहिए। पूरी तरह से struct.unpack क्यू/q विकल्प अनदेखी:

def unpack_str(s): 
    r = 0 
    for b in struct.unpack('8B', s): 
    r = r * 256 + b 
    return r 

दूसरी अंतिम पंक्ति बिट को कोसने ऑपरेटरों का उपयोग किया जा सकता था:

r = (r << 8) | b 
संबंधित मुद्दे