There isn't any resource that I know of that is going to tell you that this is safe to do in C#. But you'll get away with it, there's no mechanism in the GC that's going to keep a field of struct pinned and still allow the other fields in the struct to move. A fixed statement like this creates a pinned interior pointer, the GC is smart enough to discover the object root from that. Interior pointers only ever are mentioned in literature for C++/CLI, a language that allows declaring one directly with the interior_ptr<>
keyword. Do beware that this won't necessary work well on another CLR implementation, like Mono. YMMV. C++/CLI is otherwise the better weapon, at least you can use the original C or C++ declaration without having to rewrite it in C#. And you'll have a stable pointer to the native struct.
It shouldn't be an issue in the first place, actual object pinning is only required if the struct is part of a reference type that's allocated on the GC heap. No idea what your code looks like, but a sane approach is to keep such a struct as a local variable in the method that reads and converts the data. Such value types are allocated on the stack and have a stable address.
Do note that there are gobs of unsafe in this code, neither the compiler nor the runtime can do anything about you using the magic 32 value incorrectly. Optimizing file data conversion code is very rarely useful, the cost of reading the data is orders of magnitude higher than interpreting it. So much so that using Reflection to find the fields back is reasonable, you can't ever get it wrong that way. Jon Skeet's EndianBinaryReader ought to be mentioned too.