我的代码中有以下内容:
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
具有价值。我很感激任何帮助。感谢。
答案 0 :(得分:3)
strlen
为您提供字符串的长度,而不是任意内存区域的大小。如果您的table
内部有'\0'
,strlen
会找到它并停止计数。
此外,通过将rawTable
变为static
变量,如果buffer
或size
发生变化,则不会更新其值。 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;
}