
As Marshal pointed out, Spirit supports that easily:
std::string input("61626f6465"); std::string str; if (qi::parse(input.begin(), input.end(), qi::hex, str)) assert(str == "abode");
Is there no range-based variant of parse()?
and
std::string str("abode"); std::string output; if (karma::generate(back_inserter(output), karma::hex, str)) assert(output == "61626f6465");
If you want to avoid the cost of possible reallocations in output, just call output.reserve(...) upfront. Otherwise both code snippets generate code equivalent to hand written assembly and have been shown to be as fast as it can get.
When would generate() fail (return false)? AFAIK to hex can't fail and in that case a variant that returns std::string would be nicer.
Actually, please disregard what I wrote, it is complete nonsense. I misread your initial mail.
Note to self: drink coffee before responding to email!
Why? Your functions seem quite close to the desired functionality.
Here is what Spirit can do: std::string input("61626f6465"); unsigned ui; if (qi::parse(input.begin(), input.end(), qi::hex, ui)) assert(ui == 0x61626f6465); and unsigned ui = 0x61626f6465; std::string output; if (karma::generate(back_inserter(output), karma::hex, ui)) assert(output == "61626f6465"); As I said, I wrote nonsense with regard to your question. Sorry for the confusion. Regards Hartmut --------------- http://boost-spirit.com http://stellar.cct.lsu.edu