2015-03-23 19 views
5

Aşağıdaki gibi bir şey kullanıyorum. Daha iyi bir yolu var mı?Bir nesnenin bit sunumunu yazdırmanın bir yolu var mı?

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

'Person' doldurma bitlerini içerebilir. Sınıf Personeli '' serialize_as_binary' yöntemini kullanmak daha iyidir. Ayrıca, bu yöntemle ciltlenmiş belleği doldurabilirsiniz. Örneğin, '' '' '' '' '' '' '' '' '' '' 'uzun uzun'' sırasıyla 4 ve 8’dir. –

+0

Sonuçlara bu dolgu eklenmez mi? kelimeyi kelimelere yazdırdığımdan beri? –

+2

Ancak, dolgu uçları işe yaramaz ve kafa karıştırıcı olabilir. “Person” nesnelerini yazdırma, 2 farklı bit deseni basabilir. –

cevap

12

Ben senin Person sınıfta bir serialize_as_binary yarar sağlamak için öneririm.

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

Sanırım döngüde * (p + s) 'anlamına geldin. – Scis

+0

@MohitJain Metodumdaki tehlike/varsayımlar hakkında biraz bilgi verebilir misiniz? Teşekkürler. –

+0

'long' - char *' arasında değişiklik yaptığınızı fark etmedim. "Uzun" veya "uzun" ile sıkı takma sorunları yaşayabilirsiniz. –

2

Yasal Uyarı: Bu dolgu umursamayan basit ciddi olmayan bir çözüm olarak tasarlanmıştır. Bayt ve bitleri sağdan sola doğru yazdırır.

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]); 
} 
İlgili konular