2009-11-04 8 views
6

Si consideri il seguente:Come produrre output esadecimale con boost :: format?

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

mi piacerebbe vedere il risultato stampato come: "05-04-AA-0F-0D". Cosa devo fare per ottenere la stringa del formatter?

+0

'byte [5]' è fuori scala –

+0

whoops, my bad - modificato – Maciek

+0

@Maciek so che sono in ritardo di 2 anni, ma ecco cosa faccio in queste situazioni (buono anche per printf in C, penso) ... Se voglio mantenere la mia struttura originale (byte) e di solito non pasticcio con i modificatori (setfill, setbase), lancio ogni byte con '(unsigned int) (unsigned char)'. – nhed

risposta

8

Compilato e testato:

#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

In questa risposta il tipo di elemento è diverso dal tipo di elemento della domanda originale. In particolare, il tipo di elemento dell'originale è 'char unsigned' mentre la risposta è 'unsigned int'. Sto riscontrando un problema utilizzando boost :: format con unsigned char in cui è formattato come char piuttosto che come intero. Erano questi iostreams che andrebbero bene, ma con il formato dovrebbe essere in uscita il modo in cui lo dico lo voglio, non secondo il tipo di sicurezza. Sì, potrei trasmettere, ma sembra controcorrente. La modifica del tipo di elemento è avvenuta per ragioni simili? –

+0

@Chris Cleeland - Ah, probabilmente ero addormentato al volante. Lavorando su protocolli a byte, l'ho colpito un paio di volte da allora. 0x61 esce come 'a' invece di 97, come dici tu. La (purtroppo) risposta corretta sembra essere quella di avvolgere come int (arr [0]). Mi chiedo se questo è di progettazione, perché è una deviazione dal comportamento di printf. –

+0

grazie per il chiarimento! troppo male: il formato non fa il cast per te. Hmmm ... –

2

Utilizzando iostream solo può essere fatto manipolando flusso di output. Seguendo un esempio semplice mostra cosa si può fare.

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

uscita sarà: 05-A8

Boost formato :: permette anche di utilizzare stessi manipolatori formato.

Esempio di esempio da boost::format page illustra il suo utilizzo.

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" 

Questo dovrebbe aiutarti a ottenere ciò di cui hai bisogno.

2

Il formattatore di boost rispetta la formattazione della stampa. Hai provato:

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

?

Potrebbe anche voler aggiungere un "hh" prima della x, per indicare che il valore è 8 bit.

Problemi correlati