У меня есть дескриптор строки USB в массиве uint8_t. Например:Как напечатать дескриптор строки USB на cout/cerr в C++?
0000:12 03 34 00 45 00 36 00 31 00 42 00 43 00 30 00 ..4.E.6.1.B.C.0.
0010:30 00 0.
(Первые два байта длина и тип дескриптора, остальные байты являются uint16_t символов.)
Я хотел бы напечатать это на терминале как мало хлопот, насколько это возможно и, предпочтительно, без необходимости, чтобы ввернуть вокруг со всеми другими печати (что происходит, как cout << "Hello, world" << endl;
)
в частности, я хотел бы сделать:
cout << "Serial number is: " << some_cast_or_constructor(buf + 2, len - 2) << endl;
и для дескриптора строки выше, получим следующее в терминале:
Serial number is: 4E61BC00
Возможно ли это, или мне придется копаться в тайнах Unicode?
[редактировать добавить:]
Per @PaulMcKenzie, я попробовал эту программу:
#include <iostream>
#include <fstream>
#include <exception>
#include <string>
#include <locale>
int
main(int argc, char **argv)
{
char buf[] = { 34, 00, 45, 00, 36, 00, 31, 00, 42, 00, 43, 00, 30, 00, 30, 00 };
std::wcout << "Hello" << std::wstring((const wchar_t *)buf, sizeof(buf)) << std::endl;
return 0;
}
Выход:
user:/tmp$ g++ foo.cc
user:/tmp$ ./a.out
Hello??????????
user:/tmp$
Используйте 'std :: wcout', а не' std :: cout'. – PaulMcKenzie
Знаете ли вы, что такое 'uint16_t' байт? например, UTF-16? – Mine
Я точно не знаю ... это код USB, который я написал, но дескрипторы определены как ассемблер '.string16" abcd "'. Hexdump - это именно то, что у меня есть в буфере памяти. Я пробовал std :: wcout (за @PaulMcKenzie), но я получаю кучу? Метки. –