Ваш каст foo *f=(struct foo *)&b1;
неверен, потому что у вас есть typedef foo, а не struct foo. Вместо этого используйте foo *f=(foo *)&b1;
. То есть не используйте его вообще, потому что он нарушает строгое правило псевдонимов и является неопределенным поведением.
Вы записываете данные в виде строки и читаете их как int, это следующее неопределенное поведение.
strcpy записывает в структуру только 3 байта (два символа и завершающий \ 0). Предполагая 32-битные числа, четвертый байт int остается неопределенным. Чтение неопределенных значений - опять неопределенное поведение.
Все, что вы получаете в качестве выходных данных, не вызывает удивления, потому что все может происходить при неопределенном поведении.