2012-03-21 20 views
8

मैं समझता हूं कि सी ++ और एसटीएल का उपयोग करते समय वेक्टर का उपयोग बाइनरी डेटा स्टोर करने का एक अच्छा तरीका है। हालांकि मेरे यूनिट परीक्षणों के लिए मैं एक कॉन्स char * सी स्ट्रिंग चर का उपयोग कर वेक्टर को निष्क्रिय करना चाहता हूं।वेक्टर चार * वेक्टर <unsigned char> Initalisation

मैं यहां पाया कोड का एक संस्करण का उपयोग करने का प्रयास कर रहा हूँ - यह करने के लिए - Converting (void*) to std::vector<unsigned char>: बताते हुए, हालांकि कुलपति ++ संकलक लाइन वेक्टर initialising से खुश नहीं है

const char* testdata = "the quick brown fox jumps over the lazy dog."; 

unsigned char* buffer = (unsigned char*)testdata; 
typedef vector<unsigned char> bufferType; 

bufferType::size_type size = strlen((const char*)buffer); 
bufferType vec(buffer, size); 

:

error C2664: 'std::vector<_Ty>::vector(unsigned int,const _Ty &)' : cannot convert parameter 1 from 'char *' to 'unsigned int' 

मैं इस सवाल के चरम n00bity सराहना करते हैं और इसके बाद के संस्करण :)

अग्रिम धन्यवाद, 0 कोड पर काफी आलोचना के लिए पूरी तरह से तैयार कर रहा हूँक्रिस

+1

आप बहुत से बेहतर कर रहे हैं का उपयोग कर: 'std :: वेक्टर vec;' ' vec.push_back (" जल्दी भूरी लोमड़ी आलसी पर कूदता है कुत्ता। ");' –

+0

अंततः परीक्षण के तहत कोड का उपयोग बाइनरी डेटा को संभालने के लिए किया जाएगा, इसलिए वेक्टर के लिए वरीयता। परीक्षणों के लिए, मैं इसे कॉन्स्ट char * डेटा का उपयोग करके प्रारंभ करना चाहता हूं। –

+0

आप 'std :: string :: c_str()' का उपयोग कर अंतर्निहित चार डेटा प्राप्त कर सकते हैं, और आप कच्चे पॉइंटर्स का उपयोग करने की कई संभावित समस्याओं को बचा सकते हैं। कोई बुरा सौदा नहीं आईएमओ। –

उत्तर

11

यह होना चाहिए

bufferType vec(buffer, buffer + size); 

नहीं

+0

मुझे स्पष्ट रूप से और नींद आनी चाहिए :) बहुत धन्यवाद! –

3

std::transform समस्या का सिर्फ इस तरह के लिए उपयोगी है। आप इसे एक समय में डेटा के एक टुकड़े को "रूपांतरित" करने के लिए उपयोग कर सकते हैं। दस्तावेज़ यहां देखें:

http://www.cplusplus.com/reference/algorithm/transform/

निम्नलिखित कोड VS2010 में काम करता है। (मैं अपने const char* सरणी से एक std::string बनाया है, लेकिन आप शायद बच सकते हैं कि यदि आप वास्तव में करना चाहता था।)

#include <algorithm> 
#include <vector> 

int main(int, char*[]) 
{ 
    // Initial test data 
    const char* testdata = "the quick brown fox jumps over the lazy dog."; 

    // Transform from 'const char*' to 'vector<unsigned char>' 
    std::string input(testdata); 
    std::vector<unsigned char> output(input.length()); 
    std::transform(input.begin(), input.end(), output.begin(), 
    [](char c) 
    { 
     return static_cast<unsigned char>(c); 
    }); 

    // Use the transformed data in 'output'... 


    return 0; 
} 
0

आप क्या करने का इरादा होने के लिए कुछ की तरह लगता है क्या:

buffertype vec(testdata, next(testdata, strlen(testdata))); 

नहीं है इंटरमीडिएट buffer चर के लिए कोई ज़रूरत नहीं है। char से unsigned char पर रूपांतरण पूरी तरह से होगा।

ध्यान दें कि यह testdata से '\0' वर्ण को समाप्त नहीं करता है। तो यदि आप कुछ ऐसा करने में सक्षम होना चाहते हैं जैसे: cout << vec.data() आप सक्षम नहीं होंगे। buffertype vec(testdata, next(testdata, strlen(testdata) + 1)) या तुम सिर्फ कर विचार कर सकते हैं:

basic_string<unsigned char> vec(testdata, next(testdata, strlen(testdata))); 

जो एक छिपा हुआ '\0' सुरक्षित करेगा आपको लगता है कि तुम कर सकते हो चाहते हैं। क्योंकि यह string नहीं है, आप ऐसा करने में सक्षम नहीं होंगे, cout << vec लेकिन cout << vec.data() काम करेगा। मैंने इनमें से प्रत्येक के Live Example बनाए हैं।

+0

मुझे नहीं लगता कि यह कैसे काम कर सकता है यदि आप बड़े बाइनरी बफर का उपयोग कर रहे हैं जैसे testdata – serup

+0

@serup ओपी कहता है: "मैं' const char * 'c स्ट्रिंग चर का उपयोग करके 'वेक्टर' को निष्क्रिय करना चाहता हूं।" मैं दिखा रहा हूं कि ऐसा कैसे करें। ध्यान दें कि हम टर्मिनल वर्ण की वजह से स्ट्रिंग का प्रतिनिधित्व करने के लिए केवल 'char *' का उपयोग कर सकते हैं: '' \ 0 '' बाइनरी डेटा के लिए एक समाप्ति वर्ण अनुचित है, इसलिए आकार को 'char * से अलग से बनाए रखना होगा। '। इस स्थिति में आपको दिए गए आकार के साथ मेरे उत्तर में 'strlen (testdata)' को प्रतिस्थापित करने की आवश्यकता होगी। –

1

यहाँ क्या मेरे लिए काम किया है:

// Fetch data into vector 
std::vector<char> buffer = <myMethod>.getdata(); 

// Get a char pointer to the data in the vector 
char* buf = buffer.data(); 

// cast from char pointer to unsigned char pointer 
unsigned char* membuf = reinterpret_cast<unsigned char*>(buf);    

// now convert to vector<unsigned char> buffer 
std::vector<unsigned char> vec(membuf, membuf + buffer.size()); 

// display vector<unsigned char> 
CUtils::<myMethodToShowDataBlock>(vec);  
संबंधित मुद्दे