const char * to vector <unsigned char> Инициализация - PullRequest
9 голосов
/ 21 марта 2012

Я понимаю, что использование вектора является хорошим способом хранения двоичных данных при использовании C ++ и STL. Однако для моих модульных тестов я бы хотел инициализировать вектор, используя строковую переменную const char * C.

Я пытаюсь использовать вариант кода, найденного здесь - Преобразование (void *) в std :: vector - для этого:

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

Однако компилятор VC ++ недоволен строкой, инициализирующей вектор: «1008 *

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

Мне очень нравится этот вопрос, и я полностью готов к большой критике приведенного выше кода:)

Заранее спасибо, Chris

Ответы [ 4 ]

13 голосов
/ 21 марта 2012

Это должно быть

bufferType vec(buffer, buffer + size);

, а не

bufferType vec(buffer, size);
3 голосов
/ 21 марта 2012

std::transform полезно только для такого рода проблем. Вы можете использовать его для «преобразования» одного фрагмента данных за раз. Смотри документацию здесь:

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

Следующий код работает в VS2010. (Я создал std::string из вашего const char* массива, но вы могли бы избежать этого, если бы вы действительно этого хотели.)

#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;
}
2 голосов
/ 04 января 2017

Вот что у меня сработало:

// 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);      
0 голосов
/ 13 июня 2016

То, что вы намеревались сделать, выглядит примерно так:

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

Нет необходимости в промежуточной переменной buffer.Преобразование из char в unsigned char будет происходить неявно.

Обратите внимание, что это не захватывает завершающий символ '\0' из testdata.Поэтому, если бы вы хотели иметь возможность сделать что-то вроде: 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 каждого из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...