कन्वर्ट हेक्स स्ट्रिंग (चार []] int करने के लिए?


82

मेरे पास एक चार [] है जिसमें "0x1800785" जैसे मान शामिल हैं, लेकिन जिस फ़ंक्शन को मैं एक इंट की आवश्यकता के लिए मूल्य देना चाहता हूं, मैं इसे एक इंट में कैसे बदल सकता हूं? मैंने चारों ओर खोज की है, लेकिन उत्तर नहीं मिल रहा है। धन्यवाद।


जवाबों:


209

क्या आपने कोशिश की है strtol()?

strtol - स्ट्रिंग को एक लंबे पूर्णांक में परिवर्तित करें

उदाहरण:

यदि संख्या का स्ट्रिंग प्रतिनिधित्व एक 0xउपसर्ग के साथ शुरू होता है , तो एक को आधार के रूप में 0 का उपयोग करना चाहिए:

(यह एक स्पष्ट आधार निर्दिष्ट करना संभव है जैसे कि 16, लेकिन मैं अतिरेक पेश करने की सिफारिश नहीं करूंगा।)


4
यदि हेक्सस्ट्रिंग हमेशा एक "0x"प्रश्न के रूप में पेश किया जाता है, तो आपको 0इसके बजाय बस उपयोग करना चाहिए 16
जेन्स गस्टेड

16
@KelvinHu cplusplus.com पर भरोसा मत करो, यह बकवास है। यदि कोई हो, तो cppreference.com पर जाएं

1
@KelvinHu उस साइट पर तकनीकी रूप से गलत या शिथिल से प्रकाशित बहुत सी जानकारी है, और यदि आप SO के आसपास C ++ प्रोग्रामर देखते हैं, तो वे सभी इस कारण इस पर भरोसा करने को हतोत्साहित करेंगे।

1
@ H2CO3 ठीक है, मैं देखता हूं, मैं C ++ में नया हूं, इसलिए मैं इसे Google के साथ खोजता हूं और यह cplusplus.com को सबसे आगे की स्थिति में रखता है । आपकी जानकारी के लिए वास्तव में धन्यवाद।
केल्विन हू

3
एक साइड नोट के रूप में strtolआपको टाइप longकरता है जो बहुत बड़ी हेक्स के साथ काम करते समय बहुत अच्छा है। और भी बड़े हेक्स के strtollलिए टाइप करें long long
स्टीवन लू

20

या यदि आप अपना स्वयं का कार्यान्वयन करना चाहते हैं, तो मैंने इस त्वरित कार्य को एक उदाहरण के रूप में लिखा:


1
माइक्रोकंट्रोलर्स जैसे सीमित संसाधनों वाले प्लेटफार्मों के लिए बहुत उपयोगी है।
मुबीन आयशर

19

कुछ इस तरह उपयोगी हो सकता है:

आदमी sscanf पढ़ें


1
यह अपरिभाषित व्यवहार का कारण बनता है, %xका पता प्राप्त करना चाहिए unsigned int। और यहां तक ​​कि अगर आप इसे ठीक करते हैं, तो यदि स्ट्रिंग द्वारा दर्शाई गई संख्या से बड़ा है UINT_MAXतो यह फिर से अपरिभाषित व्यवहार है
MM

10

आप मानते हैं कि यह एक स्ट्रिंग है, स्ट्रेटोल के बारे में कैसे ?


मैं मूल रूप से स्ट्रैटोल के बजाय स्ट्रेटोड (-> डबल) से जुड़ा था। मुझे लगता है कि किसी ने इसे देखा था जब मैं संपादन कर रहा था।
जेम्स मैक्लॉघलिन

ठीक है, यह एक गलती की ज्यादा नहीं है ... संकलक ऑटो वैल्यू देता है अगर एक को खिलाया जाता है int। +1, बी.टी.वी.

मुझे नहीं लगता कि एक डबल सभी संभावित मूल्यों को 32-बिट पूर्णांक स्टोर कर सकता है (वास्तव में, क्या किसी को पता है कि क्या यह सच है? मैं फ़्लोटिंग पॉइंट नंबर प्रतिनिधित्व पर 100% नहीं हूं।)
जेम्स मैकलॉघ्लिन

4
@JamesMcLaughlin यह कर सकते हैं। 64-बिट IEEE डबल में लगभग 2 ^ 53 की अभिन्न सटीकता है।

विस्तार से, "64-बिट IEEE डबल में लगभग 2 ^ 53 की अभिन्न सटीकता है।" और एक संकेत सा। तो यह संभाल सकता है int54_tऔर uint53_t
chux - मोनिका

5

strtolयदि आपके पास उपलब्ध है तो उपयोग करें जैसे कि शीर्ष उत्तर सुझाता है। हालाँकि यदि आप कस्टम सामान पसंद करते हैं या बिना परिवाद के माइक्रोकंट्रोलर पर हैं, तो आप जटिल ब्रांचिंग के बिना थोड़ा अनुकूलित संस्करण चाहते हैं।

बिट शिफ्टिंग मैजिक फोड़े को नीचे लाती है: बस अंतिम 4 बिट्स का उपयोग करें, लेकिन यदि यह एक गैर अंक है, तो 9 भी जोड़ें।


यदि आपको मौका मिले तो आप थोड़ा और विस्तार से बता सकते हैं कि "v =" लाइन कैसे काम करती है? मैं अपने स्वयं के प्रयोजनों के लिए आपके कार्य को इस प्रकार कार्यान्वित करने में सफल रहा:unsigned long long int hextou64(char *str) { unsigned long long int n = 0; char c, v; for (unsigned char i = 0; i < 16; i++) { c = *(str + i); v = (c & 0xF) + (c >> 6) | ((c >> 3) & 0x8); n = (n << 4) | (unsigned long long int)v; } return n; }
iamoumuamua

मुझे देखने दें कि क्या मैं इसे अभी भी एक साथ प्राप्त कर सकता हूं ^ ^ यह काफी मुश्किल है मुझे लगता है .. परिसर: '0' - '9' सभी '0011 ????' से शुरू होते हैं बाइनरी में। 'ए' - 'एफ' सभी '0100 ????' से शुरू होते हैं बाइनरी में। ब्रांचिंग से बचने के लिए हम इस जानकारी का उपयोग कर सकते हैं। (c & 0xF) → केवल अंतिम चार बिट्स में मान होता है। यह '0' - '9' के लिए पहले से ही सही मूल्य है। 'ए' - 'एफ' के मामले में, हमें सही मान प्राप्त करने के लिए एक दशमलव 9 जोड़ना चाहिए। (हेक्स सी उदाहरण के लिए 0011 में समाप्त होता है। जो 3. है। हम 12 चाहते हैं। इसलिए हमें 9 जोड़ना चाहिए। (c >> 6) | ((c >> 3) & 0x8)→ एक पत्र के मामले में 9 का मूल्यांकन करता है, या एक दशमलव के मामले में 0 है। हां, काफी
हैकिंग

3

कोड के ब्लॉक के नीचे की कोशिश करो, मेरे लिए काम कर रहा है।

आउटपुट है:


3

इसलिए, खोज करने के कुछ समय बाद, और पता चला कि स्ट्रैटोल काफी धीमा है, मैंने अपने स्वयं के फ़ंक्शन को कोडित किया है। यह केवल अक्षरों पर अपरकेस के लिए काम करता है, लेकिन लोअरकेस कार्यक्षमता जोड़ने से कोई समस्या नहीं होती है।

उपयोग:

1 क्योंकि हम जिस हेक्स को बदलना चाहते हैं वह ऑफसेट 1 और 8 से शुरू होता है क्योंकि यह हेक्स की लंबाई है।

स्पीडटेस्ट (1.000.000 कॉल):


2

एक त्वरित और गंदा समाधान:

आपको यह सुनिश्चित करना होगा कि आपका इनपुट सही है, कोई सत्यापन शामिल नहीं है (कोई कह सकता है कि यह C है)। अच्छी बात यह काफी कॉम्पैक्ट है, यह 'ए' से 'एफ' और 'ए' से 'एफ' दोनों के साथ काम करता है।

दृष्टिकोण ASCII तालिका में वर्णमाला वर्णों की स्थिति पर निर्भर करता है, चलो उदाहरण के लिए Wikipedia ( https://en.wikipedia.org/wiki/ASCII#/media/File:USASCII_code_chart.png ) पर जाएं ) पर । लंबी कहानी छोटी, संख्या वर्णों के नीचे होती है, इसलिए संख्यात्मक वर्ण (0 से 9) आसानी से शून्य के लिए कोड घटाकर बदल दिए जाते हैं। पिछले तीन बिट्स (प्रभावी रूप से ऊपरी या निचले हिस्से के साथ काम करना), एक को घटाकर (क्योंकि बिट मास्किंग के बाद, वर्णमाला एक स्थिति पर शुरू होती है) और दस को जोड़ने के अलावा अन्य अक्षर (ए से एफ) पढ़े जाते हैं। क्योंकि A से F हेक्साडेसिमल कोड में 10 वें से 15 वें मूल्य का प्रतिनिधित्व करता है)। अंत में, हमें दो अंकों को संयोजित करने की आवश्यकता है जो एन्कोडेड संख्या के निचले और ऊपरी कुतरना बनाते हैं।

यहाँ हम एक ही दृष्टिकोण के साथ जाते हैं (मामूली बदलाव के साथ):


1
उत्तर पोस्ट करने के बाद मुझे पता चला कि मैं @LimeRed की पोस्ट को याद कर रहा हूं, जो बहुत प्यारा है
साइमन

1

यह हेक्साडेसिमल युक्त वर्ण को सीधे एक पूर्णांक में बदलने के लिए एक फ़ंक्शन है जिसे अतिरिक्त पुस्तकालय की आवश्यकता नहीं है:


0

मैंने हेक्साडेसिमल / डेसीमल रूपांतरण का उपयोग किए बिना एक लीब्राएरी बनाया stdio.h। उपयोग करने के लिए बहुत सरल:

पहले रूपांतरण से पहले रूपांतरण के लिए उपयोग की गई सारणी को पहले से बताएं:

यहाँ github पर लिंक: https://github.com/kevmuret/libhex/


0

मैं एक ऐसी ही बात किया है, लगता है कि यह मदद कर सकता है यू वास्तव में मेरे लिए काम कर रहा है

यहाँ मैंने केवल 8 वर्णों का एक स्ट्रिंग लिया है। यदि आप चाहते हैं कि यू अपने समान हेक्स मान देने के लिए 'ए' से 'एफ' के लिए समान तर्क जोड़ सकते हैं, तो मैंने ऐसा नहीं किया है क्योंकि मुझे इसकी आवश्यकता नहीं थी।


-5

मुझे पता है कि यह वास्तव में पुराना है, लेकिन मुझे लगता है कि समाधान बहुत जटिल लग रहे थे। VB में यह प्रयास करें:

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