Decode using proper structs (avoids casting)