How to produce hex output with boost::format?
Consider the following :
#include <vector>
#inc开发者_如何转开发lude <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;
}
I'd like to see the result printed as : "05-04-AA-0F-0D" . What do I need to do to the formatter string to achieve that ?
Compiled and tested:
#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;
}
Using iostream only it can be done by manipulating output stream. Following simple example shows what can be done.
#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;
}
Output will be: 05-a8
Boost::format also allows to use same format manipulators.
Sample example from boost::format page illustrates its usage.
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"
This should help you get what you need.
Boost formatter respects printf formatting. Have you tried:
const string formatter = "%02x-%02x-%02x-%02x-%02x";
?
May also want to add an "hh" before the x, to indicate that the value is 8 bits.
精彩评论