3

我正在将 HID 设备中的多个报告读取unsigned charstd::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++ 相当陌生,而且我已经坚持了一段时间了。谁能告诉我我做错了什么,或者为我指出一个更好的方向?

4

5 回答 5

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了,那么在他们查找之前他们不知道实际上是什么值,但他们确实知道您为什么使用该值。

于 2012-08-29T11:43:07.193 回答
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)。

于 2012-08-29T11:45:43.870 回答
1

要推回多个值,请使用 std::vector 的函数分配。例如:

std::vector<char>vec1;
char array[3] = {'a', 'b', 'c'};
vec1.assign(array, array+3);

如果我不得不这样做,我目前正在做一个项目。

于 2014-03-25T03:56:33.950 回答
0

您的向量是 type unsigned char,这意味着它的每个元素都是这种类型。你outbuf是一个无符号字符数组

唯一将push_back()一个项目附加到向量的末尾,因此push_back(*outbuf)只会将第一个元素添加outbuf到向量,而不是全部。

要将所有数据放入向量中,您需要将push_back它们一一放入,或使用std::copy.

于 2012-08-29T11:42:11.963 回答
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);
...
于 2012-08-29T11:51:39.040 回答