如何使用boost :: format生成十六进制输出?

时间:2009-11-04 14:53:49

标签: c++ boost

请考虑以下事项:

#include <vector>
#include <string>
#include <iostream>

#include <boost/format.hpp>
#include <boost/assign.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/assign/std/vector.hpp>

using namespace std;

typedef unsigned char byte;
typedef vector<byte> byte_array;

const byte_array bytes = list_of(0x05)(0x04)(0xAA)(0x0F)(0x0D);

int main()
{
    const string formatter = "%1%-%2%-%3%-%4%-%5%";
    const string result = (format(formatter)
                           % bytes[0]
                           % bytes[1]
                           % bytes[2]
                           % bytes[3]
                           % bytes[4]
                                    ).str();
    cout << result << endl;
    return 0;
}

我希望看到结果打印为:“05-04-AA-0F-0D”。我需要做什么才能实现格式化程序字符串?

3 个答案:

答案 0 :(得分:9)

编译并测试:

#include <boost/format.hpp>
#include <iostream>

using namespace std;
using namespace boost;

int main()
{
    unsigned int arr[5] = { 0x05, 0x04, 0xAA, 0x0F, 0x0D };

    cout << format("%02X-%02X-%02X-%02X-%02X")
                % arr[0]
                % arr[1]
                % arr[2]
                % arr[3]
                % arr[4]
         << endl;
}

答案 1 :(得分:2)

仅使用iostream可以通过操作输出流来完成。以下简单示例显示了可以做什么。

#include <iostream>
#include <iomanip>

unsigned char a = 0x05;
unsigned char b = 0xA8;

using namespace std;

int main()
{    
    std::cout << setbase(16) << setfill('0') << setw(2) <<
         (short)a << "-" << (short)b << std::endl;
}

输出将是:05-a8

Boost :: format也允许使用相同的格式操纵符。

来自boost::format page的示例示例说明了它的用法。

using boost::format;
using boost::io::group;
// Using manipulators, via 'group' :
cout << format("%2% %1% %2%\n")  % 1   % group(setfill('X'), hex, setw(4), 16+3) ;
// prints "XX13 1 XX13\n"

这可以帮助您获得所需。

答案 2 :(得分:2)

Boost格式化程序尊重printf格式。你试过了吗?

const string formatter = "%02x-%02x-%02x-%02x-%02x";

也可能想在x之前添加一个“hh”,表示该值为8位。