seems like this whole block belongs in a new constructor like `ReadHeadInfo(byte[] data, int offset)`.  It's not the `Set`'s responsibility to know how to marshal its members.