2009-11-04 9 views
6

considerar lo siguiente:¿Cómo producir salida hexadecimal con formato 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; 
} 

me gustaría ver el resultado impreso como: "05-04-AA-0F-0D". ¿Qué debo hacer con la cadena del formateador para lograr eso?

+0

'bytes [5]' está fuera de rango –

+0

whoops, mi edición incorrecta – Maciek

+0

@Maciek Sé que tengo 2 años de retraso, pero esto es lo que hago en estas situaciones (bueno para printf en C también creo) ... Si quiero mantener mi estructura original (bytes) y normalmente no me meto con modificadores (setfill, setbase), echo cada byte con '(unsigned int) (char sin signo)'. – nhed

Respuesta

8

Compilado y probado:

#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; 
} 
+0

En esta respuesta, el tipo de elemento es diferente del tipo de elemento de la pregunta original. Específicamente, el tipo de elemento del original es 'char sin signo' mientras que la respuesta es 'sin signo int'. Tengo un problema al usar el formato boost :: con char sin signo donde está formateándolo como un carácter en lugar de como un número entero. Si este iostream estuviera bien, pero con el formato, debería estar emitiendo de la forma que yo lo diga, no según la seguridad del tipo. Sí, podría lanzar, pero eso parece contrario. ¿El cambio en el tipo de elemento por razones similares? –

+0

@Chris Cleeland - Ah, probablemente estaba dormido al volante. Trabajando en protocolos bytewise, he golpeado esto un par de veces desde entonces. 0x61 sale como 'a' en lugar de 97, como dices. La (desafortunadamente) respuesta correcta parece ser un ajuste como int (arr [0]). Me pregunto si esto es por diseño, porque es una desviación del comportamiento de printf. –

+0

gracias por la aclaración! demasiado mal boost :: el formato no funciona para usted. Hmmm ... –

2

Usando iostream solamente se puede hacer mediante la manipulación de flujo de salida. El siguiente ejemplo simple muestra lo que se puede hacer.

#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; 
} 

de salida será: 05-a8

Boost :: formato también permite utilizar mismos manipuladores de formato.

El ejemplo de ejemplo de boost::format page ilustra su uso.

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" 

Esto debería ayudarlo a obtener lo que necesita.

2

El formateador Boost respeta el formateo de la impresora. Ha intentado:

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

?

También puede querer agregar un "hh" antes de la x, para indicar que el valor es de 8 bits.

Cuestiones relacionadas