1

我的代码中有以下内容:

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具有价值。我很感激这方面的任何帮助。谢谢。

4

2 回答 2

3

strlen给你一个字符串的长度,而不是任意内存区域的大小。如果您的内部table'\0'任何地方,strlen就会找到它并停止计数。

此外,通过创建rawTable一个变量,如果或曾经发生变化 static,它将不会更新其值。变量只构造一次。buffersizestatic

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

于 2013-11-06T20:06:26.947 回答
2

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

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

如果是这样,关键是要知道数组的大小。您需要事先知道尺寸。如果您看到的所有内容都是 type 的指针,那么在一般情况下,无法使用某个关键字或函数来确定数组的大小unsigned char*。您需要以某种方式将该信息与指针一起传递。

如果类型的指针指向一个以空字符结尾unsigned char*的字符数组(例如),那么您可以使用 C-string 函数仅使用指针来计算数组中的字符数。但是,如果数组不是以 null 结尾的,这将导致未定义的行为{'f', 'o', 'o', '\0'}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;
}
于 2013-11-06T20:44:53.667 回答