std ::使用ostream_iterator <uint8_t>以十六进制格式将原始数据复制到cout,打印出未格式化的数据。为什么?</uint8_t>

时间:2014-10-17 17:36:29

标签: c++ iterator iostream

这个想法是让一个包含任意二进制数据的向量,并以十六进制表示法将它包含的字节输出到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;。可能是什么情况?

2 个答案:

答案 0 :(得分:8)

简单更改,使用int代替uint8_t

std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout));

如果您想要大写,请使用std::uppercase

operator<<charsigned charunsigned charnon-member overloads。请参阅:uint8_t iostream behavior

答案 1 :(得分:0)

只需将 std::cout 替换为

std::ostream_iterator<uint8_t>(std::cout)

带有std::cout<<std::hexuint8_t 带有int

std::ostream_iterator<int>(std::cout<<std::hex)

这是可行的,因为 << 运算符返回对修改后的流的引用,该引用被进一步传递给迭代器。您也可以将其与其他修饰符结合使用,例如 std::showbase,例如

std::ostream_iterator<int>(std::cout<<std::showbase<<std::hex, " ")