我想写一些代码,使用hidapi做一些USB灯。hidapi中的函数期望serial_number作为wchar_t传递,但是我的argv[]是char*
它的工作方式是硬编码SERIALNUMBER并使用wcsncpy()
wcsncpy(serial_number, L"SERIALNUMBER", MAX_STR);
dev = hid_open(0x046d, 0xc900, serial_number);
不工作的方式是将序列号作为CLI参数(例如./script SERIALNUMBER
)发送,在使用函数将char*转换为wchar_t后:
void ctow(char *toConvert, wchar_t *wstr) {
int count = 0;
int len = strlen(toConvert);
for(; count < len; count++) {
wstr[count] = (wchar_t) toConvert[count];
}
}
奇怪的是,当你wprintf()
的序列号,它确实出来正确。我还注意到,如果您不将L
添加到硬编码序列号,它也不起作用。
这是一个更大的程序的一部分,但我已经将其缩减到仅用于故障排除的直接用例。我哪里做错了?下面是完整的代码:
#include <string.h>
#include <hidapi.h>
#define MAX_STR 255
void ctow(char *toConvert, wchar_t *wstr) {
int count = 0;
int len = strlen(toConvert);
for(; count < len; count++) {
wstr[count] = (wchar_t) toConvert[count];
}
}
int main(int argc, char* argv[])
{
wchar_t wstr[MAX_STR];
wchar_t serial_number[MAX_STR];
hid_device *dev;
// ctow(argv[1],serial_number); // this DOES NOT WORK
wcsncpy(serial_number, L"SERIALNUMBER", MAX_STR); // this DOES work
dev = hid_open(0x046d, 0xc900, serial_number);
if (!dev) {
wprintf(L"Open FAILED on serial number %ls", serial_number);
}
else {
wprintf(L"Open SUCCESS on serial number %ls", serial_number);
}
return 0;
}
使用mbstowcs
char* foo = "abcdef";
wchar_t *wfoo = malloc((strlen(foo) + 1) * sizeof(wchar_t));
mbstowcs(wfoo, foo, strlen(foo) + 1);
看到en.cppreference.com/w/c/string/multibyte/mbstowcs