将静态unsigned char *分配给std :: vector <unsigned char =“”> </unsigned>

时间:2013-11-06 19:54:10

标签: c++ vector char unsigned

我的代码中有以下内容:

static unsigned char* table;
...
table = something here;

现在我必须将此table分配给std::vector<unsigned char>类型的变量,我无法这样做。我在做:

unsigned char* buffer = (unsigned char*) table;
std::vector<unsigned char>::size_type size = strlen((const char*)buffer);
std::vector<unsigned char>static rawTable(buffer, buffer + size);
for(ByteBuffer::iterator it=rawTable.begin();it!=rawTable.end();++it)
    std::cout << "Raw Table: "<<*it<< std::endl;

我能够编译代码,但rawTable中没有值。请帮忙! 我已经验证变量table具有价值。我很感激任何帮助。感谢。

2 个答案:

答案 0 :(得分:3)

strlen为您提供字符串的长度,而不是任意内存区域的大小。如果您的table内部有'\0'strlen会找到它并停止计数。

此外,通过将rawTable变为static变量,如果buffersize发生变化,则不会更新其值。 static个变量只构造一次。

此外,如果这应该是一个数字数据表,您应该转换为数字非字符类型。否则cout可能会将其解释为ASCII码。

答案 1 :(得分:2)

你有一个指向数组的unsigned char*类型的指针。

然后你想把数组的每个元素都推到std::vector<unsigned char>,对吗?

如果是这样,关键是要知道数组的 size 。您需要事先知道尺寸。如果您看到的所有内容都是unsigned char*类型的指针,则无法通过某些关键字或函数来确定数组的大小。你需要以某种方式传递信息和指针。

如果类型为unsigned char*的指针指向 null-terminated (例如{'f', 'o', 'o', '\0'})的字符数组,则可以使用C-字符串函数strlen仅使用指针计算数组中的字符数。但是,如果数组未以空值终止,则会导致未定义的行为

当你拥有size时,使用数组元素填充std::vector是一件简单的事情:

std::vector<unsigned char> v(arr, arr + size); // arr = pointer to array.

这就是为什么你应该使用标准库中的容器而不是原始数组,因为这些容器在内部跟踪大小,你总是可以使用size()函数访问它。

对于常量大小的数组,请使用std::array。例如:

std::array<unsigned char, 3> arr{'f', 'o', 'o'}; // arr.size() == 3
// Print its contents.
for (auto c : arr) {
    std::cout << c << std::endl;
}