2012-12-22 11 views
7

इनपुट = 'FFFF' # 4 ASCII एफ केमैं कैसे एक हस्ताक्षरित पूर्णांक करने के लिए एक हेक्स ASCII स्ट्रिंग में बदल सकते हैं

वांछित परिणाम ... -1 एक पूर्णांक

कोड की कोशिश की है:

hexstring = 'FFFF' 
result = (int(hexstring,16)) 
print result #65535 

परिणाम: 65535

कुछ भी नहीं जो मैंने कोशिश की है, यह माना जाता है कि 'एफएफएफएफ' एक नकारात्मक संख्या का प्रतिनिधित्व है।

+1

कुछ (मुझे वाक्यविन्यास नहीं पता) 'अगर (मान> 0x7FFF) मान - = 0x10000'? –

उत्तर

10

अजगर 'फेस वैल्यू' पर FFFF धर्मान्तरित, 65535

input = 'FFFF' 
val = int(input,16) # is 65535 

आप इसे एक 16-बिट पर हस्ताक्षर किए संख्या के रूप में व्याख्या चाहते दशमलव में। नीचे कोड किसी भी संख्या के निचले 16 बिट ले जाएगा, और 'प्रवेश का विस्तार', यानी व्याख्या एक 16-बिट पर हस्ताक्षर किए मूल्य के रूप में और उद्धार इसी पूर्णांक

val16 = ((val+0x8000)&0xFFFF) - 0x8000 

यह आसानी से सामान्यीकृत है

def sxtn(x, bits): 
    h= 1<<(bits-1) 
    m = (1<<bits)-1 
    return ((x+h) & m)-h 
+0

और हाँ, 'अगर वैल> = 0x8000: वैल - = 0x10000' इस मामले में ठीक काम करता है जब इनपुट 0 .. 0xFFFF (जन ड्वोरक से) के रूप में जाना जाता है। – greggo

2

सी, 'एफएफएफएफ' जैसी भाषा में किसी हस्ताक्षरित (-1) या हस्ताक्षरित (65535) मान के रूप में व्याख्या की जा सकती है। आप जिस व्याख्या को चाहते हैं उसे मजबूर करने के लिए आप पाइथन के स्ट्रक्चर मॉड्यूल का उपयोग कर सकते हैं।

ध्यान दें कि अंतहीनता समस्याएं हो सकती हैं कि नीचे दिए गए कोड से निपटने का कोई प्रयास नहीं होता है, और यह 16-बिट से अधिक लंबे डेटा को संभाल नहीं करता है, इसलिए यदि आप इनमें से किसी भी मामले में हैं तो आपको अनुकूलित करना होगा आपके लिए असल में

import struct 

input = 'FFFF' 

# first, convert to an integer. Python's going to treat it as an unsigned value. 
unsignedVal = int(input, 16) 
assert(65535 == unsignedVal) 
# pack that value into a format that the struct module can work with, as an 
# unsigned short integer 
packed = struct.pack('H', unsignedVal) 
assert('\xff\xff' == packed) 

# ..then UNpack it as a signed short integer 
signedVal = struct.unpack('h', packed)[0] 
assert(-1 == signedVal) 
+0

एंडियननेस यहां कोई मुद्दा नहीं है, क्योंकि एच और एच परिचालनों में हमेशा एक ही अंतहीनता होगी। – greggo

+0

आह, सच है। आपके उत्तर में +1। – bgporter