gpt4 book ai didi

c++ - 如何将多个 char 读取合并到一个 std::vector 中?

转载 作者:太空狗 更新时间:2023-10-29 20:05:42 24 4
gpt4 key购买 nike

我正在从 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++ 的新手,我已经坚持了一段时间了。谁能告诉我我做错了什么,或者指出更好的方向?

最佳答案

您想将多个 unsigned char 对象添加到您的 vector 中,但 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));

它们都做同样的事情。

您创建具有特定大小的 vector :

buffer_t retbuf(0x40 * reports);

但是 push_back 通过在末尾添加一个元素来增加 vector 的大小。您应该将其创建为空:

buffer_t retbuf;

您可以选择为 vector 分配足够的空间,为要添加的元素做好准备:

retbuf.reserve(0x40 * reports);

这纯粹是一个性能问题,但有时对于大型 vector 或类型的 vector (与 unsigned char 不同)当 vector 耗尽内部空间时复制/移动成本很高时,这是一个重要问题空间,必须分配更多。

关于样式的注意事项:您重复字面值 0x40 几次,并且还使用了 sizeof(outbuf)。通常最好定义一个常量,并在整个过程中使用该名称:

const int report_size = 0x40;

这部分是为了防止将来数字发生变化,但也与代码的可读性有关——如果有人看到 0x40,他们可能会或可能不会立即理解为什么这是正确的值。如果有人看到 report_size,那么他们在查找之前并不知道实际值是什么,但他们知道您为什么使用该值。

关于c++ - 如何将多个 char 读取合并到一个 std::vector 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12176960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com