Other than the array() method which I don’t use,
the rest seems fine.
It might be clearer to use the predefined
constants gr.GR_MSB_FIRST or gr.GR_LSB_FIRST
to set the endianess (see gnuradio-core/src/lib/gengen/gr_endianness.h)
You can always connect the Rx chain and see if
in the absense of noise you get the original file back
In order to turn the QPSK symbols into bytes (demodulation)
you can use the block “gr.constellation_decoder_cb”;
the rest shouls be straightforward.
Also, take a look at
the function run_test() to see a similar setup using
packed-to-unpacked, chunks2symbols, etc (although not OFDM).
When you have the simple OFDM scheme ready and working,
let me know so I can help you add a convolutional code to it
and also inter/deinterleaving etc (it is all in gr-trellis).