2009-11-04 12 views
30

मेरे पास unsigned char* है, इसे std::string पर परिवर्तित करना चाहते हैं। क्या आप कृपया मुझे ऐसा करने का सबसे सुरक्षित तरीका बता सकते हैं?सी ++ में unsigned char * से std :: स्ट्रिंग को कैसे परिवर्तित करें?

+3

सी ++ ताकि आप हमें बताने के लिए किस प्रकार का वास्तव में है की जरूरत है, एक बाइट प्रकार नहीं है। – Yacoby

+1

BYTE "हस्ताक्षरित चार" – Unicorn

+3

और 'बाइट' के बारे में क्या है? और सबसे महत्वपूर्ण बात यह है कि आप पॉइंटर को क्या इंगित करते हैं? एक 'बाइट' मान या 'बाइट' की सरणी? आप अपनी स्ट्रिंग में क्या चाहते हैं: ऑब्जेक्ट (ओं) के मानों का प्रतिनिधित्व करने वाले सूचक या स्ट्रिंग के मान का एक पाठ्य प्रतिनिधित्व? –

उत्तर

48

के किसी भी उपयोग कर सकते हैं तुम सिर्फ एक चार में अहस्ताक्षरित चार कास्ट करने के लिए के रूप में स्ट्रिंग वर्ग एक निर्माता नहीं है की जरूरत है कि स्वीकार करता है अहस्ताक्षरित चार:

unsigned char* uc; 
std::string s(reinterpret_cast< char const* >(uc)) ; 

लेकिन, आप, यदि आपका बाइट सरणी nulls शामिल निर्माता में लंबाई तर्क का उपयोग करने की आवश्यकता होगी के रूप में अगर यो यू न केवल सरणी के भाग के स्ट्रिंग (प्रथम अशक्त करने के लिए सरणी)

size_t len; 
unsigned char* uc; 
std::string s(reinterpret_cast<char const*>(uc), len) ; 
+0

BYTE * pbData = "SomeString" size_t length = 10 मेरे पास हाथ से पहले की लंबाई है, इसलिए मैंने इसका उपयोग किया: I इस विधि का प्रयोग किया, "std :: string (reinterpret_cast (pbData), लंबाई);" यह काम करता है, लेकिन एक बार जब मैं memcpy में दुर्घटना देखते हैं। हमारे दुर्घटना क्यों हुई, यह जानने के लिए ट्रिंट, हालांकि यह मेरे लिए काम कर रहा है – Unicorn

+3

एक पोर्टेबिलिटी पेडेंट के रूप में, मैं यह इंगित करना चाहता हूं कि यह केवल 2 के पूरक अंकगणितीय वाले सिस्टम पर काम करता है। 1 के पूरक या साइन-परिमाण आर्किटेक्चर पर, 'char *' और 'unsigned char *' के बीच reinterpret_cast को सुरक्षित नहीं है (ठीक है, यह सुरक्षित है, लेकिन यदि आपको 'char' हस्ताक्षरित किया गया है और किसी भी वर्ण में आश्चर्यचकित परिणाम मिलेंगे शीर्ष बिट सेट है)। इस मामले में प्रश्नकर्ता स्पष्ट रूप से विंडोज पर है, इसलिए कोई समस्या नहीं है। –

3
BYTE *str1 = "Hello World"; 
std::string str2((char *)str1); /* construct on the stack */ 

वैकल्पिक रूप से:

std::string *str3 = new std::string((char *)str1); /* construct on the heap */ 
cout << &str3; 
delete str3; 
+0

यह काम नहीं करता है, मुझे यह कहते हुए एक त्रुटि मिलती है कि "std :: basic_string <_Elem, _Traits, _Ax> :: basic_string (const std :: allocator <_Ty> और) ':' BYTE * 'से' const 'में पैरामीटर 1 को परिवर्तित नहीं कर सकता std :: allocator <_Ty> और ' – Unicorn

+1

ऐसा इसलिए है क्योंकि 'std :: string' में कोई कन्स्ट्रक्टर नहीं है जो' हस्ताक्षरित char * 'लेता है, और इसलिए संकलक आवंटकों के लिए टेम्पलेट किए गए कन्स्ट्रक्टर पर वापस आ जाता है। आपको या तो 'std :: string (Iterator start, Iterator end) ', या' std :: string (const char *, std :: size_t n)' का उपयोग करने की आवश्यकता है और BYTE * को char * –

+4

'std पर डालना होगा: : स्ट्रिंग और str3 = नया ... ', क्या आपका मतलब '' '' '' '' '' 'था। और बीटीडब्ल्यू, ढेर पर std :: स्ट्रिंग बनाना आम तौर पर खराब विचार है और मूल्य semantics के साथ एक स्ट्रिंग वर्ग रखने के आधे उद्देश्य को हरा देता है। – sbk

5

BYTE* शायद unsigned char* के लिए एक typedef है, लेकिन मुझे यकीन है कि के लिए नहीं कह सकता। अगर आप हमें बताएंगे कि BYTE क्या है तो इससे मदद मिलेगी।

यदि BYTE * हस्ताक्षरित char * है, तो आप std :: स्ट्रिंग रेंज कन्स्ट्रक्टर का उपयोग करके इसे std :: स्ट्रिंग में परिवर्तित कर सकते हैं, जिसमें दो सामान्य Iterators होंगे।

const BYTE* str1 = reinterpret_cast<const BYTE*> ("Hello World"); 
int len = strlen(reinterpret_cast<const char*>(str1)); 
std::string str2(str1, str1 + len); 

कहा जा रहा है, क्या आप वाकई यह एक अच्छा विचार है? यदि BYTEunsigned char में गैर-ASCII वर्ण हो सकते हैं, जिसमें NULL शामिल हो सकते हैं। यह strlen गलत लम्बाई देगा।

2

बाइट लेकिन typedef unsigned char BYTE;

कुछ भी नहीं आप आसानी से नीचे कंस्ट्रक्टर्स

string (const char * s, size_t n); 
string (const char * s); 
0

तो CryptoPP की पहुंच है में खत्म हो जाएगा करते

पठनीय हेक्स स्ट्रिंग अहस्ताक्षरित चार को

std::string& hexed = "C23412341324AB"; 
uint8_t  buffer[64] = {0}; 
StringSource ssk(hexed, true, 
      new HexDecoder(new ArraySink(buffer,sizeof(buffer)))); 

और वापस

std::string hexed; 
uint8_t val[32] = {0}; 
StringSource ss(val, sizeof(val), true,new HexEncoder(new StringSink(hexed)); 
// val == buffer 
संबंधित मुद्दे