अजगर में int करने के लिए हेक्स स्ट्रिंग परिवर्तित करें


764

मैं पायथन में एक हेक्स स्ट्रिंग को इंट में कैसे परिवर्तित करूं?

मेरे पास यह " 0xffff" या सिर्फ " ffff" हो सकता है।

जवाबों:


1086

0x उपसर्ग के बिना , आपको आधार को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है, अन्यथा बताने का कोई तरीका नहीं है:

x = int("deadbeef", 16)

साथ 0x उपसर्ग, पायथन स्वचालित रूप से हेक्स और दशमलव भेद कर सकते हैं।

>>> print int("0xdeadbeef", 0)
3735928559
>>> print int("10", 0)
10

( इस उपसर्ग-अनुमान व्यवहार को लागू करने के लिए आपको आधार के रूप में निर्दिष्ट करना चाहिए0 ; दूसरे पैरामीटर को छोड़ने का अर्थ है आधार -10 को ग्रहण करना।)


25
जिसका अर्थ है कि आपको हमेशा 16 को दूसरे तर्क के रूप में उपयोग करना चाहिए। निहितार्थ की तुलना में स्पष्ट है।
बछसौ

13
@ लबसौ, स्पष्ट रूप से असत्य। यदि आप उपयोगकर्ता इनपुट पढ़ना चाहते हैं, तो हेक्स या दशमलव में इनपुट की अनुमति दें, जो भी उपयोगकर्ता के लिए सुविधाजनक है?
दान लैंस्की

7
ठीक है, मुझे कहना चाहिए: इस विशेष मामले में! मूल प्रश्न था "मैं हेक्स स्ट्रिंग कैसे परिवर्तित करूं ..."। यदि आप इसे उपयोगकर्ता के लिए छोड़ना चाहते हैं, तो यह एक उपयोगी विशेषता है, इसके साथ ही आप सही हैं।
बछसौ

@DanLenski, यह हमेशा हेक्स स्ट्रिंग्स को धनात्मक संख्याओं में परिवर्तित करता है। मैं int("FFFF",16)-1 में परिवर्तित होना चाहता हूं ।
नज़र

@ अब इसे एक लंबा समय हो गया है, इसलिए यह इस बिंदु पर आपके लिए उपयोगी नहीं है, लेकिन किसी और के लिए जो यहां से ठोकर खाता है, यदि दो पूरक नियमों को लागू करना आवश्यक है। यह जवाब stackoverflow.com/questions/1604464/twos-complement-in-python
जेरेमी

163

int(hexString, 16) चाल करता है, और 0x उपसर्ग के साथ और बिना काम करता है:

>>> int("a", 16)
10
>>> int("0xa",16)
10


43

अजगर में int करने के लिए हेक्स स्ट्रिंग परिवर्तित करें

मेरे पास ऐसा हो सकता है "0xffff"या बस "ffff"

एक स्ट्रिंग को एक इंट में बदलने के लिए, स्ट्रिंग को intउस आधार के साथ पास करें जिससे आप परिवर्तित कर रहे हैं।

इस तरह से रूपांतरण के लिए दोनों तार पर्याप्त होंगे:

>>> string_1 = "0xffff"
>>> string_2 = "ffff"
>>> int(string_1, 16)
65535
>>> int(string_2, 16)
65535

दे intअनुमान

यदि आप आधार के रूप में 0 पास करते हैं, intतो स्ट्रिंग में उपसर्ग से आधार का अनुमान लगाएगा।

>>> int(string_1, 0)
65535

हेक्साडेसिमल उपसर्ग के बिना, 0x, intपर्याप्त जानकारी है जिसके साथ लगता है की जरूरत नहीं है:

>>> int(string_2, 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 0: 'ffff'

शाब्दिक:

यदि आप स्रोत कोड या एक दुभाषिया में टाइप कर रहे हैं, तो पायथन आपके लिए रूपांतरण करेगा:

>>> integer = 0xffff
>>> integer
65535

यह साथ काम नहीं करेगा ffffक्योंकि पायथन को लगेगा कि आप इसके बजाय एक वैध पायथन नाम लिखने की कोशिश कर रहे हैं:

>>> integer = ffff
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'ffff' is not defined

पायथन संख्या एक संख्यात्मक चरित्र से शुरू होती है, जबकि पायथन नाम एक संख्यात्मक चरित्र से शुरू नहीं हो सकता है।


वर्थ दोहराते हुए "अंतरंग का अनुमान लगाते हैं यदि आप 0 को आधार के रूप में पास करते हैं, तो int स्ट्रिंग में उपसर्ग से आधार का अनुमान लगाएगा।" अजगर इंटरप्रेटर के रूप में हेक्साडेसिमल या दशमलव (या बाइनरी) से पूर्णांक में कैसे परिवर्तित किया जाए।
गौइत

13

ऊपर दिए गए डैन के उत्तर को जोड़ना: यदि आप हेक्स स्ट्रिंग के साथ इंट () फ़ंक्शन की आपूर्ति करते हैं, तो आपको आधार को 16 के रूप में निर्दिष्ट करना होगा या यह नहीं लगेगा कि आपने इसे एक वैध मान दिया है। आधार संख्या 16 को निर्दिष्ट करना हेक्स संख्या के लिए अनावश्यक है जो तार में समाहित नहीं है।

print int(0xdeadbeef) # valid

myHex = "0xdeadbeef"
print int(myHex) # invalid, raises ValueError
print int(myHex , 16) # valid

5

सबसे खराब तरीका:

>>> def hex_to_int(x):
    return eval("0x" + x)

>>> hex_to_int("c0ffee")
12648430

कृपया यह मत करो!

क्या पायथन में इसका इस्तेमाल करना एक बुरा व्यवहार है?


3
यह ध्यान देने योग्य है कि इसके evalसाथ अन्य सभी मुद्दों के शीर्ष पर भी बेतुका धीमा है।
j6m8

4
यदि यह एक बुरा विचार है, तो इसे लाने की क्या बात है?
पिपरी

3
अच्छी बात। आंशिक रूप से क्योंकि मुझे लगता है कि यह मज़ेदार और आंशिक रूप से है क्योंकि मैंने इसे उत्पादन कोड में देखा है।
आंद्रे लास्ज़ो

मुझे शायद ध्यान देना चाहिए कि मैं int(s,16)अनुचित मूल्यों को वापस करने के मुद्दों का सामना करने के बाद ऐसा कर रहा था , जिससे मेरे रनटाइम ( int(hex(value),16) == int(value) >>> False) के साथ कुछ प्रमुख मुद्दे पैदा हो गए । आपूर्ति की गई स्ट्रिंग eval()सुरक्षित थी और लौटाया गया मान उचित था।
Tcll

1
मैं इस हास्यास्पद और ज्ञानवर्धक, im खुशी है कि यह पोस्ट किया गया हो पाया
frogeyedpeas

3

या ast.literal_eval(यह सुरक्षित है, इसके विपरीत eval):

ast.literal_eval("0xffff")

डेमो:

>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>> 

1

फ़ॉर्मेटर विकल्प '% x'% मेरे लिए असाइनमेंट स्टेटमेंट में भी काम करता है। (पायथन 3.0 मानकर और बाद में)

उदाहरण

a = int('0x100', 16)
print(a)   #256
print('%x' % a) #100
b = a
print(b) #256
c = '%x' % a
print(c) #100

टिप्पणियां गलत हैं। print(b)आउटपुट करेगा 256, नहीं 100और print(c)आउटपुट करेगा 100, नहीं 256। यह भी ध्यान दें कि cयह एक स्ट्रिंग है, लेकिन aऐसा नहीं है कि आपका जवाब वास्तव में एक इंट को स्ट्रिंग में परिवर्तित करता है, न कि दूसरे तरीके के आसपास (यह वही है जो सवाल है)।
एंड्रे लास्ज़्लो

आपके इनपुट के लिए धन्यवाद, मैं सहमत हूं कि मेरा उत्तर सही नहीं है, और अब मैंने इसे ठीक कर लिया है। हालाँकि, मुझे लगता है कि उत्तर का यह हिस्सा ऊपर (यानी, आधार) का उपयोग करते हुए बेमानी है, लेकिन फिर भी बाकी उत्तर पोस्ट में अधिक विकल्प जोड़ता है, मुझे विश्वास है। इस बात से सहमत ?
साउंडराजन

संबद्ध नहीं; यह बेस 16 से बेस 10 में बदलने के बारे में है, अन्य तरीके से नहीं
पिपरी

1

यदि आप अजगर दुभाषिया का उपयोग कर रहे हैं, तो आप केवल 0x (आपका हेक्स मान) टाइप कर सकते हैं और दुभाषिया इसे आपके लिए स्वचालित रूप से परिवर्तित कर देगा।

>>> 0xffff

65535

1

हेक्स, ऑक्टल, बाइनरी, इंट, और फ्लोट को संभालता है

मानक उपसर्गों (यानी 0x, 0b, 0, और 0o) का उपयोग करके यह फ़ंक्शन किसी भी उपयुक्त स्ट्रिंग को संख्या में बदल देगा। मैंने इसका उत्तर यहाँ दिया: https://stackoverflow.com/a/58997070/2464381 लेकिन यहाँ आवश्यक कार्य है।

def to_number(n):
    ''' Convert any number representation to a number 
    This covers: float, decimal, hex, and octal numbers.
    '''

    try:
        return int(str(n), 0)
    except:
        try:
            # python 3 doesn't accept "010" as a valid octal.  You must use the
            # '0o' prefix
            return int('0o' + n, 0)
        except:
            return float(n)

-1

पायथन 2.7 में, int('deadbeef',10)काम नहीं करता है।

निम्नलिखित मेरे लिए काम करता है:

>>a = int('deadbeef',16)
>>float(a)
3735928559.0

4
यह प्रश्न का उत्तर कैसे देता है?
पिपरी

-5

'0x' उपसर्ग के साथ, आप eval फ़ंक्शन का उपयोग भी कर सकते हैं

उदाहरण के लिए

>>a='0xff'
>>eval(a)
255

16
सुनिश्चित करें कि यदि eval का उपयोग कर इनपुट सत्यापन सही ढंग से किया गया है। वास्तव में, एक बेहतर तरीका है। Eval का उपयोग न करें।
ALOToverflow

7
बहुत कम से कम आप का उपयोग किया जाना चाहिए ast.literal_eval
एंडी हेडन

2
साथ ही बहुत धीमी गति से। सबसे खराब रास्ता।
तन्नु सैमुअल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.