2010-05-15 15 views
17

मेरे पास एक हस्ताक्षरित चार सरणी है जिसे मुझे std :: स्ट्रिंग में चाहिए, लेकिन मेरा वर्तमान तरीका reinterpret_cast का उपयोग करता है जिसे मैं टालना चाहता हूं। क्या ऐसा करने का कोई क्लीनर तरीका है?बिना हस्ताक्षर किए गए char को stdterpret_cast के बिना std :: string में प्राप्त करने का तरीका?

unsigned char my_txt[] = { 
    0x52, 0x5f, 0x73, 0x68, 0x7e, 0x29, 0x33, 0x74, 0x74, 0x73, 0x72, 0x55 
} 
unsigned int my_txt_len = 12; 

std::string my_std_string(reinterpret_cast<const char *>(my_txt), my_txt_len); 
+1

और आपको 'reinterpret_cast' क्यों पसंद नहीं है ...? – egrunin

+3

यह हमेशा एक कास्ट को मजबूर करने के लिए हैक की तरह लगता है, मैं कुछ और चीजों के रूप में व्यवहार करने के लिए मजबूर करने के बजाए चीजों का उपयोग करना चाहता हूं। – WilliamKF

+0

'my_txt' के लिए आपका उपयोग' char' क्यों नहीं है; आखिरकार, आपके द्वारा पोस्ट किए गए मान ASCii हैं। इससे अन्य मुद्दों को हल करने का कारण बन सकता है। –

उत्तर

19

इटरेटर निर्माता का प्रयोग करें। यदि आप चाहते हैं तो उन्हें दोबारा परिभाषित किया जाए, तो आपको reinterpret_cast का उपयोग करना चाहिए। यह पूरी तरह से साफ होगा, क्योंकि आप जो कहते हैं वह ठीक है।

आपके उदाहरण में, हालांकि, इससे कोई फर्क नहीं पड़ता है, क्योंकि आपकी सरणी में सभी मान 0 से CHAR_MAX तक हैं। तो यह गारंटी है कि उन मानों को char में उसी तरह दर्शाया गया है क्योंकि वे unsigned char में हैं, और इसलिए उन्हें दोबारा बदलने के समान ही उन्हें परिवर्तित करना समान है। यदि आपके पास CHAR_MAX से अधिक मूल्य थे तो कार्यान्वयन की उन्हें अलग-अलग इलाज करने की अनुमति है।

+0

हस्ताक्षरित चार के चारों ओर परिवर्तित होने के बीच क्या अंतर है और उन्हें 'व्याख्या' किया जा रहा है चार के रूप में? – bitek

+0

@ बाडडिज़ाइन: अधिकांश कार्यान्वयन पर इससे कोई फर्क नहीं पड़ता है, लेकिन असामान्य आर्किटेक्चर पर एक हो सकता है। 'CHAR_MAX' से अधिक मान को परिवर्तित करने का नतीजा कार्यान्वयन-परिभाषित है। Reinterpreting का परिणाम प्रकार के मूल्य प्रतिनिधित्व पर निर्भर करता है, और कनवर्ट करने के समान होने की गारंटी नहीं है। –

+0

हाय @steve क्या सरणी को स्ट्रिंग बनाने से पहले पिछली 0 की आवश्यकता है? – Noitidart

7

क्या आपने एसस्ट्रीम की कोशिश की है?

std::string my_std_string(my_txt, my_txt + my_txt_len); 

यह मानते हुए कि जाती है कि आप अहस्ताक्षरित वर्ण चार करने के लिए परिवर्तित किया जा करना चाहते हैं:

 stringstream s; 
    s << my_txt; 

    string str_my_txt = s.str(); 
+0

यह मेरे लिए बहुत अच्छा काम करता है, सुनिश्चित नहीं है कि आप क्यों कहते हैं कि यह काम नहीं करता है? – WilliamKF

+0

हाँ - आपका बिल्कुल सही !!! वहाँ कारण का एक क्षणिक चूक था !!! –

+2

बाहर निकलता है कि मैं सिर्फ भाग्यशाली हो रहा था, कुछ मामलों में नलिका को समाप्त करने वाले एबीआर का कारण बनता है। यहां संबंधित प्रश्न देखें: http://stackoverflow.com/questions/2889074/why-do-i-get-this-strange-output-behavior – WilliamKF

0
int _tmain(int argc, _TCHAR* argv[]) 
    { 
     unsigned char temp = 200; 
     char temp1[4]; 

     sprintf(temp1, "%d", temp); 

     std::string strtemp(temp1); 

     std::cout<<strtemp.c_str()<<std::endl; 

     return 0; 
    } 
+2

जबकि यह कोड स्निपेट आपकी पोस्ट की गुणवत्ता में सुधार के लिए एक स्पष्टीकरण [वास्तव में मदद करता है] (// meta.stackexchange.com/q/114762) सहित प्रश्न हल कर सकता है। याद रखें कि आप भविष्य में पाठकों के लिए सवाल का जवाब दे रहे हैं, न केवल उस व्यक्ति से पूछ रहे हैं! स्पष्टीकरण जोड़ने के लिए कृपया अपना उत्तर संपादित करें, और संकेत दें कि कौन सी सीमाएं और धारणाएं लागू होती हैं। –

संबंधित मुद्दे