这个想法是让一个包含任意二进制数据的向量,并以十六进制表示法将它包含的字节输出到stdout。我使用std :: copy将输入向量中的字节复制到stdout。问题是代码打印出0后跟原始二进制数据。这是代码:
auto vec = std::vector<uint8_t> {'h', 'e', 'l', 'l', 'o'};
std::cout << std::hex << std::setfill('0') << std::setw(2);
std::copy(vec.begin(), vec.end(), std::ostream_iterator<uint8_t>(std::cout));
应用程序打印出&#34; 0hello&#34;。我希望它打印出来&#34; 68656C6C6F&#34;。可能是什么情况?
答案 0 :(得分:8)
简单更改,使用int
代替uint8_t
:
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout));
如果您想要大写,请使用std::uppercase
。
operator<<
对char
,signed char
和unsigned char
有non-member overloads。请参阅:uint8_t iostream behavior。
答案 1 :(得分:0)
只需将 std::cout
替换为
std::ostream_iterator<uint8_t>(std::cout)
带有std::cout<<std::hex
和uint8_t
带有int
std::ostream_iterator<int>(std::cout<<std::hex)
这是可行的,因为 <<
运算符返回对修改后的流的引用,该引用被进一步传递给迭代器。您也可以将其与其他修饰符结合使用,例如 std::showbase,例如
std::ostream_iterator<int>(std::cout<<std::showbase<<std::hex, " ")