Estoy escribiendo una aplicación de C++ y me preguntaba lo que el C++ convencional manera de almacenar una matriz de bytes en la memoria.

Hay algo como una cadena, excepto hecho específicamente para datos binarios.

Ahora mismo estoy utilizando un *unsigned char** matriz para almacenar los datos, pero algo más de STL/C++ como sería mejor.

InformationsquelleAutor The Unknown | 2009-05-07

3 Comentarios

  1. 37

    Yo uso la std::vector<unsigned char>. La mayoría de las operaciones que usted necesita se puede hacer uso de la STL con iterador rangos. También, recuerde que si usted realmente necesita los datos en bruto &v[0] está garantizado para darle un puntero a la matriz subyacente.

    • No hay necesidad de confiar en &v[0] cuando v.data() es más clara.
    • De hecho, sin embargo, en 2009 data() no estaba definido en std::vector.
  2. 23

    Puede utilizar std::string también para datos binarios. La longitud de los datos en std::string se almacena de forma explícita y no se determina por el nulo de terminación, así null bytes no tienen un significado especial en un std::string.

    std::string a menudo es más conveniente que std::vector<char> porque proporciona muchos métodos que son útiles para trabajar con datos binarios pero no suministrados por vector. Para analizar/crear datos binarios es útil tener las cosas como substr(), sobrecargas para + y std::stringstream a tu disposición. En los vectores de los algoritmos de <algorithm> puede ser utilizado para conseguir los mismos efectos, pero es más torpe que la cadena de métodos. Si usted acaba de actuar en «secuencias de caracteres», std::string le da los métodos que normalmente se desea, incluso si estas secuencias se suceden a contener «binario» de datos.

    • o std::vector<unsigned char>
    • También me gustaría usar std::vector<unsigned char>.
    • std::vector<unsigned char> tiene la ventaja de que uno puede obtener su contenido como un /escritura/ char puntero (por &vec[0]). Por otro lado, usted no recibe el copy-on-write optimización común en std::string implementaciones.
    • Una escritura de búfer de &obj[0] es también cierto para std::string implícitamente a través de los otros requisitos. De hecho, 0x hace explícito.
  3. 21

    Debe utilizar std::vector<unsigned char> o std::vector<uint8_t> (si usted tiene un moderno stdint.h encabezado). No hay nada malo con el uso de unsigned char[] o uint8_t[] si usted está trabajando con búferes de tamaño fijo. Donde std::vector realmente brilla es cuando usted necesita crecer o anexar a su tampones con frecuencia. STL iteradores tienen la misma semántica como punteros, por lo que los algoritmos de STL va a funcionar igual de bien con std::vector y antiguo llano de matrices.

    Y como CAdaker señalado, la expresión &v[0] está garantizado para darle el subyacente puntero al vector de amortiguamiento (y es garantía de ser un bloque contiguo de memoria). Esta garantía fue añadido en una adenda al estándar de C++.

    Personalmente, me gustaría evitar el uso de std::string para manipular arbitraria búferes de bytes, ya que creo que es potencialmente confuso, pero no es un inaudito de la práctica.

Dejar respuesta

Please enter your comment!
Please enter your name here