将const char *转换为vector<unsigned char>初始化

11

我知道在C++和STL中使用向量是存储二进制数据的好方法。但是对于我的单元测试,我想使用const char* C字符串变量初始化向量。

我正在尝试使用在此处找到的代码的变体- 将(void*)转换为std::vector<unsigned char> - 来实现此目的:

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++编译器不允许初始化向量的那一行代码,报错如下:

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

我很欣赏这个问题的极度新手性,对上面的代码做出批评也有充分的准备:)

提前感谢, Chris


1
更好的选择是使用:`std::vector vec;` `vec.push_back("the quick brown fox jumps over the lazy dog.");` - Alok Save
被测试的代码最终将用于处理二进制数据,因此更喜欢使用vector<unsigned char>。对于测试,我想使用const char* data进行初始化。 - Mr Chris
你可以通过使用 std::string::c_str() 简单地获取底层的 char 数据,这样你就可以避免使用裸指针带来的潜在问题。在我看来,这不是一个坏交易。 - Alok Save
1
这是我的原始方法,但我担心使用 c_str() 会在数组末尾添加一个额外的 \0 字节。对于字符串来说很好,但对于二进制数据来说不好。 - Mr Chris
4个回答

17

应该这样做

bufferType vec(buffer, buffer + size);

bufferType vec(buffer, size);

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

3
以下是对我有效的方法:

这里是我所使用的方法:

// 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

你打算做的似乎是这样的:

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

中间变量buffer是不必要的。从charunsigned 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()会起作用。我已经创建了实时示例


如果您正在使用大型二进制缓冲区作为测试数据,我不认为这种方法会奏效。 - serup
@serup OP表示:“我想使用const char* C字符串变量初始化vector。” 我正在演示如何执行此操作。请注意,由于终止字符'\0',我们只能使用char来表示字符串。但对于二进制数据来说,终止字符是不恰当的,因此大小必须与char分开维护。在这种情况下,您需要将我的答案中的strlen(testdata)替换为给定的大小。 - Jonathan Mee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接