c++ - 相当于 PyUSB usb.util.find_descriptor 的 libusb
问题描述
PyUSB 有一个小实用函数usb.util.find_descriptor
,顾名思义,它允许我搜索具有特定条件的描述,例如:
ep = usb.util.find_descriptor(
intf,
# match the first OUT endpoint
custom_match = \
lambda e: \
usb.util.endpoint_direction(e.bEndpointAddress) == \
usb.util.ENDPOINT_OUT)
我在使用 libusb 构建的 C++ 应用程序中需要相同的功能。但是我在libusb API 规范中没有看到任何类似的东西。在 libusb 之上实现相同功能的最简单方法是什么?
我在Linux上,如果这有所作为。但是,除非严格要求,否则我宁愿不添加任何额外的依赖项。
更新:
这是我到目前为止所拥有的:
libusb_config_descriptor* config;
int ret = libusb_get_config_descriptor(m_dev, 0 /* config_index */, &config);
if (ret != LIBUSB_SUCCESS) {
raise_exception(std::runtime_error, "libusb_get_config_descriptor() failed: " << usb_strerror(ret));
}
// Do not assume endpoint_in is 1
const libusb_interface *interface = config->interface;
const libusb_interface_descriptor configuration = interface->altsetting[0];
for(int i = 0; i < configuration.bNumEndpoints; ++i) {
const libusb_endpoint_descriptor endpoint = configuration.endpoint[i];
if ((endpoint.bEndpointAddress & LIBUSB_ENDPOINT_IN) == LIBUSB_ENDPOINT_IN) {
endpoint_in = endpoint.bEndpointAddress >> 8; // 3 first bytes
log_debug("endpoint_in: " << endpoint_in);
}
}
迭代以这种方式工作,尽管它看起来很丑陋,而且它大多是不可重用的。此外,使用以下方法提取端点编号:
endpoint_in = endpoint.bEndpointAddress >> 8; // 3 first bytes
似乎不起作用。
解决方案
推荐阅读
- wpf - WPF - 在鼠标悬停时将背景从线性更改为实心
- java - 为什么当我尝试在 Firebase 数据库中写入时出现此错误?与 FirebaseApp$IdTokenListener 相关
- java - 确定二进制文件的环境和版本
- tensorflow - 具有持续训练/模型更新的机器学习(张量流或其他)
- excel - 从 Python 或 Excel 中的字符串中提取多个数值
- javascript - 函数通过调用自身来复制JavaScript中的对象,需要帮助理解逻辑
- javascript - 如何使用 Mongoose 在 AngularJS 中创建 PUT 函数
- php - 为什么 auth/login 路径返回 404 错误?
- java - 如何将我的 SpringBoot 后端连接到颤振?
- sql - 尝试生成一个唯一 ID,该 ID 既不是整数也不是纯文本中的其他值