我正在从HID设备读取多个报告到unsigned char
,然后尝试将数据复制到std::vector
。我也将数据写入文件进行十六进制分析,当我查看它时,其内容似乎是正确的。但是,当我将其转储到控制台时,std::vector
似乎不包含正确的数据。
这是代码:
typedef vector<unsigned char> buffer_t;
buffer_t sendCommand (hid_device *devh, const unsigned char cmd[], int reports) {
unsigned char outbuf[0x40];
buffer_t retbuf(0x40 * reports);
hid_write(devh, cmd, 0x41);
int i;
FILE *file = fopen("test.out", "w+b");
while (i++ < reports) {
hid_read(devh, outbuf, 0x40);
fwrite(outbuf, 1, sizeof(outbuf), file);
retbuf.push_back(*outbuf);
}
fclose(file);
cout << &retbuf[0];
return retbuf;
}
我有一种感觉,我在这里不合时宜;我是C / C ++的新手,现在我已经坚持了一段时间。任何人都可以告诉我我做错了什么,或者指出我的方向更好吗?
答案 0 :(得分:6)
您想向向量添加多个unsigned char
个对象,但push_back
只会添加一个。
因此,请将retbuf.push_back(*outbuf);
替换为:
for (size_t i = 0; i < sizeof(outbuf); ++i) {
retbuf.push_back(outbuf[i]);
}
或
std::copy(outbuf, outbuf+sizeof(outbuf), std::back_inserter(retbuf));
或
retbuf.insert(retbuf.end(), outbuf, outbuf+sizeof(outbuf));
所有人都做同样的事情。
您可以使用特定大小创建矢量:
buffer_t retbuf(0x40 * reports);
但是push_back
通过在末尾添加元素来增加向量的大小。你应该把它创建为空:
buffer_t retbuf;
或者,您可以安排向量分配足够的空间,为您要添加的元素做好准备:
retbuf.reserve(0x40 * reports);
这纯粹是一个性能问题,但有时它对于大型向量来说是一个重要问题,或者类型向量(与unsigned char
不同)在向量用完内部空间时复制/移动是昂贵的,并且必须分配更多。
关于样式的注释:您重复几次字面值0x40
,并使用sizeof(outbuf)
。通常最好定义一个常量,并在整个过程中使用该名称:
const int report_size = 0x40;
部分原因在于未来数字会发生变化,但也与代码的可读性有关 - 如果有人看到0x40
,他们可能会或可能不会立即理解为什么这是正确的价值。如果有人看到report_size
,那么在他们查找之前他们不知道实际上是什么价值,但是他们确实知道你为什么要使用这个价值。
答案 1 :(得分:1)
问题在于这一行:buffer_t retbuf(0x40 * reports);
这意味着你创建了带有0x40 * reports
元素的向量,这些元素填充了unsigned char(零)的默认值。然后push_back()
只是在向量的末尾添加新元素,而不会影响现有元素。
您需要以这种方式重写:
buffer_t retbuf; // Empty vector
retbuf.reserve(0x40 * reports); // Preallocate memory for known element count
这种方式push_back()
将按预期工作,并从头开始向空向量添加元素。
当然,你应该push_back()outbuf
的所有元素,而不仅是第一个(*outbuf
)。
答案 2 :(得分:1)
要回退多个值,请使用std :: vector&#39的函数赋值。例如:
std::vector<char>vec1;
char array[3] = {'a', 'b', 'c'};
vec1.assign(array, array+3);
我目前正在开展一个项目,我必须这样做。
答案 3 :(得分:0)
您的矢量属于unsigned char
类型,这意味着它的每个元素都属于此类型。您的outbuf
是无符号字符的数组。
push_back()
只会将一个项目附加到向量的末尾,因此push_back(*outbuf)
只会将outbuf
的第一个元素添加到向量中,而不是全部。
要将所有数据放入向量中,您需要逐个push_back
,或使用std::copy
。
答案 4 :(得分:0)
请注意,由于outbuf是一个char数组,因此* outbuf将是char数组的第一个元素,因为数组/指针具有二元性。
我想你可能想这样做:
typedef vector<string> buffer_t; // alternatively vector<unsigned char*>
...
retbuf.push_back(outbuf);
...
或
typedef vector<unsigned char> buffer_t;
...
for (size_t i = 0; i < sizeof(outbuf); i++)
retbuf.push_back(outbuf);
...