習作としてWindows BMP(24bit)を操作するプログラムを作ろうとしています。
しかしヘッダーの上手い出力の仕方がわからず、
char bFileHeader[BMPFILEHEADER_S + 1]; // BITMAPFILEHEADER(14bytes)
中略
// BITMAPFILEHEADER
bFileHeader[0] = 'B';
bFileHeader[1] = 'M';
*((int*)(bFileHeader + 2)) = filesize;
*((int*)(bFileHeader + 6)) = 0x00;
*((int*)(bFileHeader + 10)) = BMPFILEHEADER_S + BMPINFOHEADER_S;
中略
fwrite(bFileHeader, BMPFILEHEADER_S, 1, fp);
としており、実際に正規なファイルを出力しますが、
可読性が低いし、書くのが大変な気がします。
構造体と#pragma packを使いたくない場合、
普通はどのようにしてこれを行うのでしょうか?

また、最近ではBMPは使わずPNGを使いたい場合が多いようですが、
初心者にPNGの仕様を与えたところで、実装できるようなレベルではないとあります。
プロの(職業プログラマ)のレベルだとPNGの実装くらい自前で行えるのは当たり前なんでしょうか?
(ライブラリがあるだろうに、わざわざ自分で実装することが愚かかどうかは別にして、技術的に)