2015-03-23 5 views
5

Sto usando qualcosa come il seguente. C'è un modo migliore?C'è un modo per stampare la rappresentazione bit di un oggetto?

for (int i = 0; i < sizeof(Person) ; i++) { 
    const char &cr = *((char*)personPtr + i); 
    cout << bitset<CHAR_BIT>(cr); 
} 
+1

'Persona' può contenere bit di riempimento. Meglio usare un metodo 'serialize_as_binary' in' class Person'. Inoltre si può finire fuori dalla memoria legata con questo metodo. Ad esempio se 'sizeof' il' Person' e 'long long' sono 4 e 8 rispettivamente. –

+0

Non saranno incluse quelle padding nel risultato? dal momento che sto stampando parola per parola? –

+2

Ma i bit di riempimento sono inutili e potrebbero essere fonte di confusione. La stampa di uguali oggetti 'Persona' può stampare 2 pattern di bit diversi. –

risposta

12

vorrei suggerire di fornire un programma di utilità serialize_as_binary nella classe Person.

template<typename T> 
void serialize_as_bin(const T &t, ostream& os) { 
    const unsigned char *p = reinterpret_cast<const unsigned char *>(&t); 
    for(size_t s = 0; s < sizeof t; ++s, ++p) serialize_as_bin(*p, os); 
} 

template<> 
void serialize_as_bin(const unsigned char &t, ostream& os) { 
    // Code to serialize one byte 
    std::bitset<CHAR_BIT> x(t); 
    os << x; 
} 

struct Person { 
    A a; 
    B b; 

    ostream& serialize_as_binary(ostream& os) { 
    serialize_as_bin(a, os); 
    serialize_as_bin(b, os); 
    return os; 
    } 
    void deserialize_from_binary() { 
    // Similar stuff if required 
    ... 
    } 
}; 

Live example here

+0

Penso che tu intendessi '* (p + s)' nel ciclo. – Scis

+0

@MohitJain Puoi spiegare un po 'del pericolo/delle ipotesi nel mio metodo? Grazie. –

+0

Non mi sono accorto di aver cambiato 'long' in' char * '. Con 'long' o' long long' dovrai affrontare rigidi problemi di aliasing. –

2

responsabilità: Questo è inteso come una soluzione semplice non grave che non si preoccupa di imbottitura. Stampa i byte e i bit da destra a sinistra.

template<typename T> 
void PrintBits(const T& o) { 
    for (size_t i = sizeof(o) - 1; i < sizeof(o); --i) 
    std::cout << std::bitset<CHAR_BIT>(reinterpret_cast<const unsigned char*>(&o)[i]); 
}