0

我经常做这样的事情:

uint8_t c=some_value;
std::cout << std::setfill('0') << std::setw(2);
std::cout << std::hex << int(c);
std::cout << std::setfill(' ');

(特别是在转储调试信息时)。拥有一些可以操纵的东西,我可以像这样放入流中,这不是很好吗:

std::cout << "c 值:0x" << hexb(c) << '\n';

那会做所有这些吗?有谁知道这是怎么做到的吗?

我已经让这个工作,但希望有一个更简单的方法:

#include <iostream>
#include <iomanip>
class hexcdumper{
public:
    hexcdumper(uint8_t c):c(c){};
    std::ostream&
    operator( )(std::ostream& os) const
    {
        // set fill and width and save the previous versions to be restored later
        char fill=os.fill('0');
        std::streamsize ss=os.width(2);

        // save the format flags so we can restore them after setting std::hex
        std::ios::fmtflags ff=os.flags();

        // output the character with hex formatting
        os  << std::hex << int(c);

        // now restore the fill, width and flags
        os.fill(fill);
        os.width(ss);
        os.flags(ff);
        return os;
    }
private:
    uint8_t c;
};

hexcdumper
hexb(uint8_t c)
{
    // dump a hex byte with width 2 and a fill character of '0'
    return(hexcdumper(c));
}

std::ostream& operator<<(std::ostream& os, const hexcdumper& hcd)
{    
   return(hcd(os)); 
}

当我这样做时:

std::cout << "0x" << hexb(14) << '\n';
  1. hexb(c) 被调用并返回一个 hexcdumper 其构造函数保存 c
  2. hexcdumper 的重载 operator<< 调用 hexcdumper::operator() 将流传递给它
  3. hexcdumper 的 operator() 为我们做了所有的魔法
  4. 在 hexcdumper::operator() 返回后,重载的 operator<< 返回从 hexcdumper::operator() 返回的流,因此链接有效。

在输出中,我看到:

0x0e

有没有更简单的方法来做到这一点?

帕特里克

4

1 回答 1

0

您可以直接在流管道上执行此操作:

std::cout << "Hex = 0x" << hex << 14 << ", decimal = #" << dec << 14 << endl;

输出:

Hex = 0xe, decimal = #14
于 2013-07-17T02:16:13.113 回答