В настоящее время я начинаю с boost :: spirit :: *. Я пытаюсь разобрать 128-битную строку в простой массив c с соответствующим размером. Я создал короткий тест, который выполняет свою работу:
boost::spirit::qi::int_parser< boost::uint8_t, 16, 2, 2 > uint8_hex;
std::string src( "00112233445566778899aabbccddeeff" );
boost::uint8_t dst[ 16 ];
bool r;
for( std::size_t i = 0; i < 16; ++i )
{
r = boost::spirit::qi::parse( src.begin( ) + 2 * i, src.begin( ) + 2 * i + 2, uint8_hex, dst[ i ] );
}
У меня такое чувство, что это не самый умный способ сделать это :) Есть идеи, как определить правило, чтобы я мог избежать цикла?
Обновление:
Тем временем я придумал следующий код, который очень хорошо справляется со своей задачей:
using namespace boost::spirit;
using namespace boost::phoenix;
qi::int_parser< boost::uint8_t, 16, 2, 2 > uint8_hex;
std::string src( "00112233445566778899aabbccddeeff" );
boost::uint8_t dst[ 16 ];
std::size_t i = 0;
bool r = qi::parse( src.begin( ),
src.end( ),
qi::repeat( 16 )[ uint8_hex[ ref( dst )[ ref( i )++ ] = qi::_1 ] ] );