Z tohoto fóra se už opravdu stala žumpa. Někdo napíše nějaký dotaz, a jediné odpovědi, které dostane, jsou "seš úplně blbý, když něco takového děláš."
Přetypování struktury na binární reprezentaci je něco, co se samozřejmě v C/C++ často dělá, typicky v ovladačích nebo jako hlavičky souborů či paketů. Není to ovšem úplně přímočaré, je potřeba splnit 4 podmínky:
- struktura musí mít definovanou paměťovou podobu. V C++ se tomu dříve říkalo POD (Plain Old Data), od C++11 je to komplikovanější. V principu to znamená, že struktura obsahuje pouze základní typy nebo jiné POD struktury (pravidla jsou složitější, ale takhle by to mělo stačit). Potom je struktura skutečně v paměti organizovaná položku za položkou a překladač si tam nemůže přidat žadný další balast.
- Položky musí mít definovanou velikost. C/C++ nezaručuje jak je velký int či další standardní typy, proto je potřeba používat standardní typy uint_8, uint_16 atd.
- Vypnout zarovnávání položek struktury, které způsobuje, že překladač kolem menších položek vkládá prázdné místo. Na to má každý překladač jinou pragmu, kterou je potřeba si najít. A je silně vhodné pragmu obalit #ifdefem, který překladač detekuje a do else větve přidat #error, který varuje na kód závislý na platformě.
- A popasovat se s endianitou. Lze použít klasická síťová makra ntoh a hton. Anebo lepší, podle mne, je Boost.Endian knihovna.
Pokud tyto podmínky jsou splněné, pak přetypování už je hračka:
MojeHlavicka header;
const uint_8* buffer = reinterpret_cast<uint_8*>(&header);
Vzhledem k tomu, jak je tohle řešení křehké, tak ideální C++ řešení je si naprogramovat nějaké streamy (tzn. objekty, které budou mít něco jako writeInt, writeByte atd.), které budou binární podobu vytvářet/číst. Ale uvnitř nich stejně nakonec budeš potřebovat řešit alespoň endianitu.
Rozhodně ale nikdy nemíchej objekt a binární reprezentaci, jak tu někdo napovídal - porušíš první podmínku a můžeš se se zlou potázat.