2012-03-21 28 views
8

Entiendo que el uso del vector es una buena forma de almacenar datos binarios cuando se usa C++ y el STL. Sin embargo, para las pruebas de mi unidad me gustaría inicializar el vector usando una variable de cadena const char * C.const char * vector <unsigned char> Initalisation

Estoy intentando utilizar una variante del código que se encuentra aquí - Converting (void*) to std::vector<unsigned char> - para hacer esto:

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); 

Sin embargo, el VC++ compilador no está contento con la línea de inicialización del vector, indicando:

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

aprecio el n00bity extrema de esta cuestión y estoy totalmente preparado para muchas críticas en el código anterior :)

Gracias de antemano, Chris

+1

Es mucho mejor usar: 'std :: vector vec ;' ' vec.push_back (" el rápido zorro marrón salta sobre el perezoso dog. ");' –

+0

El código bajo prueba se usará finalmente para manejar datos binarios, de ahí la preferencia por vector . Para las pruebas, me gustaría inicializarlo usando const char * data. –

+0

Puede obtener los datos subyacentes de char simplemente usando 'std :: string :: c_str()', y ahorrará muchos problemas potenciales al usar punteros sin procesar. No es un mal trato IMO. –

Respuesta

11

Debe ser

bufferType vec(buffer, buffer + size); 

no

+0

claramente debería dormir más :) ¡Muchas gracias! –

3

std::transform es útil sólo para este tipo de problema. Puede usarlo para "transformar" una pieza de datos a la vez. Consulte la documentación aquí:

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

El código siguiente funciona en VS2010. (He creado un std::string de su panel const char*, pero es probable que pudiera evitar que si realmente quería.)

#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

Lo que se pretende hacer parece ser algo como:

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

Hay sin necesidad de la variable intermedia buffer. La conversión de char a unsigned char ocurrirá implícitamente.

Tenga en cuenta que esto no captura el carácter de terminación '\0' de testdata. Entonces, si quisieras hacer algo como: cout << vec.data(), no podrías. Si quieres que se podía hacer: buffertype vec(testdata, next(testdata, strlen(testdata) + 1)) o puede que sólo quieren considerar hacer:

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

que preservará una oculta '\0'. Como no es un string, no podrá hacerlo, cout << vec, pero cout << vec.data() funcionará. Creé un Live Example de cada uno de estos.

+0

No veo cómo podría funcionar esto si está utilizando búferes binarios grandes como testdata – serup

+0

@serup El OP dice: "Me gustaría initalizar el' vector' utilizando una variable de cadena 'const char *'. Estoy demostrando cómo hacer eso. Tenga en cuenta que solo podemos usar un 'char *' para representar una cadena debido al carácter de terminación: ''\ 0'' Sin embargo, un carácter de terminación no es apropiado para datos binarios, por lo que el tamaño debería mantenerse separado del' char * '. En esta situación, necesitarías reemplazar 'strlen (testdata)' en mi respuesta con el tamaño dado. –

1

Esto es lo que funcionó para mí:

// 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);  
Cuestiones relacionadas