Save File Structure¶
Complete technical reference for the Elden Ring save file format.
All sizes and offsets are sourced directly from the parser implementation.
File Layout¶
File size: ~26 MB (26,214,400 bytes, PC)
Endianness: Little-endian throughout
Checksum: MD5 per section (PC only)
Offset Size Section
─────────────────────────────────────────────────────────
0x000 4 bytes Magic
0x004 0x2FC Header (PC) / 0x6C (PlayStation)
─────────────────────────────────────────────────────────
0x300 0x280010 Character Slot 0
0x280310 0x280010 Character Slot 1
0x500320 0x280010 Character Slot 2
0x780330 0x280010 Character Slot 3
0xA00340 0x280010 Character Slot 4
0xC80350 0x280010 Character Slot 5
0xF00360 0x280010 Character Slot 6
0x1180370 0x280010 Character Slot 7
0x1400380 0x280010 Character Slot 8
0x1680390 0x280010 Character Slot 9
─────────────────────────────────────────────────────────
0x19003A0 0x60010 USER_DATA_10 (SteamID, profiles)
0x1F003B0 0x240010 USER_DATA_11 (Regulation data)
─────────────────────────────────────────────────────────
Platform Detection¶
| Magic bytes | Platform | Notes |
|---|---|---|
42 4E 44 34 (BND4) | PC Steam | Standard |
53 4C 32 00 (SL2\x00) | PC (alt) | Accepted by parser |
CB 01 9C 2C | PlayStation | No checksums |
Character Slot (UserDataX)¶
Each slot is 0x280010 bytes on PC, 0x280000 on PlayStation.
PC slot layout:
0x00-0x0F 16 bytes MD5 checksum
0x10-... 0x280000 Character data
PlayStation slot layout:
0x00-... 0x280000 Character data (no checksum)
Empty slot detection: checksum bytes are all 0x00.
The parser reads slots sequentially in this exact order:
Field Type Size
──────────────────────────────────────────────────────────────────────
version uint32 4
map_id MapId 4
unk0x8 bytes 8
unk0x10 bytes 16
gaitem_map Gaitem[] 5118×8 or 5120×8
player_game_data PlayerGameData 432 (0x1B0)
sp_effects SPEffect[13] 208 (0xD0)
equipped_items_equip_index EquipmentSlots 88 (0x58)
active_weapon_slots_and_arm ActiveWeaponSlots 28 (0x1C)
equipped_items_item_id EquipmentSlots 88 (0x58)
equipped_items_gaitem_handle EquipmentSlots 88 (0x58)
inventory_held Inventory variable
equipped_spells EquippedSpells 116 (0x74)
equipped_items EquippedItems 140 (0x8C)
equipped_gestures EquippedGestures 24 (0x18)
acquired_projectiles AcquiredProjectiles variable
equipped_armaments_and_items EquippedArmamentsAndItems 156 (0x9C)
equipped_physics EquippedPhysics 12 (0xC)
face_data FaceData 303 (0x12F)
inventory_storage_box Inventory variable
gestures Gestures 256 (0x100)
unlocked_regions Regions variable
horse RideGameData 40 (0x28)
control_byte_maybe uint8 1
blood_stain BloodStain 68 (0x44)
unk_gamedataman_0x120 uint32 4
unk_gamedataman_0x88 uint32 4
menu_profile_save_load MenuSaveLoad variable
trophy_equip_data TrophyEquipData 52 (0x34)
gaitem_game_data GaitemGameData variable
tutorial_data TutorialData variable
gameman_0x8c uint8 1
gameman_0x8d uint8 1
gameman_0x8e uint8 1
total_deaths_count uint32 4
character_type uint32 4
in_online_session_flag uint32 4
character_type_online uint32 4
last_rested_grace uint32 4
not_alone_flag uint32 4
in_game_countdown_timer uint32 4
unk_gamedataman_0x124 uint32 4
event_flags bytes 1,833,375 (0x1BF99F)
event_flags_terminator uint32 4
field_area FieldArea variable
world_area WorldArea variable
world_geom_man WorldGeomMan variable
world_geom_man2 WorldGeomMan variable
rend_man RendMan variable
player_coordinates PlayerCoordinates 57 (0x39)
game_man_0x5be uint8 1
game_man_0x5bf uint8 1
spawn_point_entity_id uint32 4
game_man_0xb64 uint32 4
temp_spawn_point_entity_id uint32 (version >= 65) 4 or 0
game_man_0xcb3 uint32 (version >= 66) 4 or 0
net_man NetMan 131,076 (0x20004)
world_area_weather WorldAreaWeather 12 (0xC)
world_area_time WorldAreaTime 12 (0xC)
base_version BaseVersion 16 (0x10)
steam_id uint64 8
ps5_activity PS5Activity 32 (0x20)
dlc DLC 50 (0x32)
player_data_hash PlayerGameDataHash 128 (0x80)
rest bytes remainder
──────────────────────────────────────────────────────────────────────
Gaitem count: 5118 if version <= 81, 5120 if version > 81.
PlayerGameData - 432 bytes (0x1B0)¶
Character stats, attributes, and metadata.
Offset Size Field
──────────────────────────────────────────────────
0x00 4 unk0x0
0x04 4 unk0x4
0x08 4 hp
0x0C 4 max_hp
0x10 4 base_max_hp
0x14 4 fp
0x18 4 max_fp
0x1C 4 base_max_fp
0x20 4 unk0x20
0x24 4 sp (stamina)
0x28 4 max_sp
0x2C 4 base_max_sp
0x30 4 unk0x30
──────────────────────────────────────────────────
0x34 4 vigor
0x38 4 mind
0x3C 4 endurance
0x40 4 strength
0x44 4 dexterity
0x48 4 intelligence
0x4C 4 faith
0x50 4 arcane
0x54 4 unk0x54
0x58 4 unk0x58
0x5C 4 unk0x5c
──────────────────────────────────────────────────
0x60 4 level
0x64 4 runes
0x68 4 runes_memory
0x6C 4 unk0x6c
──────────────────────────────────────────────────
0x70 4 poison_buildup
0x74 4 rot_buildup
0x78 4 bleed_buildup
0x7C 4 death_buildup
0x80 4 frost_buildup
0x84 4 sleep_buildup
0x88 4 madness_buildup
0x8C 4 unk0x8c
0x90 4 unk0x90
──────────────────────────────────────────────────
0x94 32 character_name (UTF-16LE, 16 chars max)
0xB4 2 terminator
──────────────────────────────────────────────────
0xB6 1 gender
0xB7 1 archetype
0xB8 1 unk0xb8
0xB9 1 unk0xb9
0xBA 1 voice_type
0xBB 1 gift
0xBC 1 unk0xbc
0xBD 1 unk0xbd
0xBE 1 additional_talisman_slot_count
0xBF 1 summon_spirit_level
0xC0 24 unk0xc0
──────────────────────────────────────────────────
0xD8 1 furl_calling_finger_on (bool)
0xD9 1 unk0xd9
0xDA 1 matchmaking_weapon_level
0xDB 1 white_cipher_ring_on (bool)
0xDC 1 blue_cipher_ring_on (bool)
0xDD 26 unk0xdd
0xF7 1 great_rune_on (bool)
0xF8 1 unk0xf8
──────────────────────────────────────────────────
0xF9 1 max_crimson_flask_count
0xFA 1 max_cerulean_flask_count
0xFB 21 unk0xfb
──────────────────────────────────────────────────
0x110 18 password (UTF-16LE, 8 chars + terminator)
0x122 18 group_password1
0x134 18 group_password2
0x146 18 group_password3
0x158 18 group_password4
0x16A 18 group_password5
──────────────────────────────────────────────────
0x17C 52 unk0x17c (padding)
──────────────────────────────────────────────────
432 total
SPEffect - 16 bytes per entry, 13 entries (208 bytes total)¶
Active status effects, buffs, weapon enchants.
Offset Size Type Field
──────────────────────────────
0x00 4 int32 sp_effect_id
0x04 4 float remaining_time
0x08 4 uint32 unk0x8
0x0C 4 uint32 unk0x10
──────────────────────────────
16 total per entry
An entry is active when sp_effect_id != 0 and remaining_time > 0.
Equipment Slots - 88 bytes (0x58)¶
Used by three parallel structures: EquippedItemsEquipIndex, EquippedItemsItemIds, EquippedItemsGaitemHandles. All three have identical layout, differing only in what the values mean (inventory index, item ID, or gaitem handle).
Offset Size Field
──────────────────────────────
0x00 4 left_hand_armament1
0x04 4 right_hand_armament1
0x08 4 left_hand_armament2
0x0C 4 right_hand_armament2
0x10 4 left_hand_armament3
0x14 4 right_hand_armament3
0x18 4 arrows1
0x1C 4 bolts1
0x20 4 arrows2
0x24 4 bolts2
0x28 4 unk0x28
0x2C 4 unk0x2c
0x30 4 head
0x34 4 chest
0x38 4 arms
0x3C 4 legs
0x40 4 unk0x40
0x44 4 talisman1
0x48 4 talisman2
0x4C 4 talisman3
0x50 4 talisman4
0x54 4 unk0x54
──────────────────────────────
88 total
ActiveWeaponSlotsAndArmStyle - 28 bytes (0x1C)¶
Offset Size Field
──────────────────────────────
0x00 4 arm_style
0x04 4 left_hand_weapon_active_slot
0x08 4 right_hand_weapon_active_slot
0x0C 4 left_arrow_active_slot
0x10 4 right_arrow_active_slot
0x14 4 left_bolt_active_slot
0x18 4 right_bolt_active_slot
──────────────────────────────
28 total
Inventory - variable size¶
Two instances: held and storage box.
Field Type Notes
──────────────────────────────────────────────────────────────
common_item_count uint32 actual item count
common_items InventoryItem held: 0xA80 slots, storage: 0x780 slots
key_item_count uint32 actual key item count
key_items InventoryItem held: 0x180 slots, storage: 0x80 slots
equip_index_counter uint32
acquisition_index_counter uint32
──────────────────────────────────────────────────────────────
All slots are always written to disk (empty slots have zeroed data). Counts reflect actual items, capacity is fixed.
InventoryItem - 12 bytes:
Offset Size Field
──────────────────────────
0x00 4 gaitem_handle
0x04 4 quantity
0x08 4 acquisition_index
──────────────────────────
12 total
EquippedSpells - 116 bytes (0x74)¶
14 spell slots + active index.
Field Type Size Notes
──────────────────────────────────────────────
spell_slots Spell[14] 112 8 bytes each
active_index uint32 4
──────────────────────────────────────────────
116 total
Spell - 8 bytes:
EquippedItems - 140 bytes (0x8C)¶
Quick items and pouch items.
Field Type Size Notes
──────────────────────────────────────────────────────
quick_items EquippedItem 80 10 × 8 bytes
active_quick_item_index uint32 4
pouch_items EquippedItem 48 6 × 8 bytes
unk0x84 uint32 4
unk0x88 uint32 4
──────────────────────────────────────────────────────
140 total
EquippedItem - 8 bytes:
EquippedGestures - 24 bytes (0x18)¶
6 equipped gesture IDs, each 4 bytes.
AcquiredProjectiles - variable¶
Field Type Notes
──────────────────────────────────────────
count uint32 number of entries
projectiles Projectile[] count × 8 bytes
──────────────────────────────────────────
Projectile - 8 bytes: id (uint32) + unk0x4 (uint32).
EquippedArmamentsAndItems - 156 bytes (0x9C)¶
Combined equipment state including quick items and pouch. Extends the 88-byte equipment slots with 10 quick item slots, 6 pouch slots, and 1 unknown field.
Offset Size Field
──────────────────────────────
0x00 88 (same as EquipmentSlots layout above)
0x58 4 quickitem1
0x5C 4 quickitem2
0x60 4 quickitem3
0x64 4 quickitem4
0x68 4 quickitem5
0x6C 4 quickitem6
0x70 4 quickitem7
0x74 4 quickitem8
0x78 4 quickitem9
0x7C 4 quickitem10
0x80 4 pouch1
0x84 4 pouch2
0x88 4 pouch3
0x8C 4 pouch4
0x90 4 pouch5
0x94 4 pouch6
0x98 4 unk0x98
──────────────────────────────
156 total
EquippedPhysics - 12 bytes (0xC)¶
Wondrous Physick tear slots.
FaceData - 303 bytes (0x12F)¶
Character appearance data. Stored as raw bytes - contains 100+ fields for facial features, body proportions, and color sliders. When read from ProfileSummary (USER_DATA_10), reads 0x120 bytes instead of 0x12F.
Gestures - 256 bytes (0x100)¶
64 gesture IDs, each 4 bytes (uint32).
Regions - variable¶
Field Type Notes
──────────────────────────────────────
count uint32
region_ids uint32[] count × 4 bytes
──────────────────────────────────────
RideGameData (Torrent) - 40 bytes (0x28)¶
Offset Size Type Field
──────────────────────────────────────────
0x00 12 FloatVector3 coordinates (x, y, z)
0x0C 4 MapId map_id
0x10 16 FloatVector4 angle (x, y, z, w)
0x20 4 int32 hp
0x24 4 uint32 state (HorseState enum)
──────────────────────────────────────────
40 total
HorseState values: INACTIVE = 0, ACTIVE = 13, DEAD = 3
Torrent bug: hp == 0 AND state == ACTIVE (13) causes infinite loading. Fix: set state = DEAD (3).
BloodStain - 68 bytes (0x44)¶
Death location and lost runes.
Offset Size Type Field
──────────────────────────────────────
0x00 12 FloatVector3 coordinates
0x0C 16 FloatVector4 angle
0x1C 4 uint32 unk0x1c
0x20 4 uint32 unk0x20
0x24 4 uint32 unk0x24
0x28 4 uint32 unk0x28
0x2C 4 uint32 unk0x2c
0x30 4 uint32 unk0x30
0x34 4 uint32 runes
0x38 4 MapId map_id
0x3C 4 uint32 unk0x3c
0x40 4 uint32 unk0x38
──────────────────────────────────────
68 total
Event Flags - 1,833,375 bytes (0x1BF99F)¶
Bitfield encoding all quest flags, boss defeats, grace unlocks, and world state. Each bit corresponds to a specific game event by ID. Followed by a 4-byte event_flags_terminator.
PlayerCoordinates - 57 bytes (0x39)¶
Offset Size Type Field
──────────────────────────────────────────
0x00 12 FloatVector3 coordinates
0x0C 4 MapId map_id
0x10 16 FloatVector4 angle
0x20 1 uint8 game_man_0xbf0
0x21 12 FloatVector3 unk_coordinates
0x2D 16 FloatVector4 unk_angle
──────────────────────────────────────────
57 total
NetMan - 131,076 bytes (0x20004)¶
Network manager state. unk0x0 (uint32, 4 bytes) followed by 0x20000 bytes of data.
WorldAreaWeather - 12 bytes (0xC)¶
Offset Size Type Field
──────────────────────────────
0x00 2 uint16 area_id
0x02 2 uint16 weather_type
0x04 4 uint32 timer
0x08 4 uint32 padding
──────────────────────────────
12 total
Corruption: area_id == 0 when character is in a real location, or timer > 100000.
WorldAreaTime - 12 bytes (0xC)¶
Offset Size Type Field
──────────────────────────
0x00 4 uint32 hour
0x04 4 uint32 minute
0x08 4 uint32 second
──────────────────────────
12 total
Should match seconds_played from ProfileSummary. All zeros indicates corruption.
BaseVersion - 16 bytes (0x10)¶
Offset Size Type Field
──────────────────────────────────
0x00 4 uint32 base_version_copy
0x04 4 uint32 base_version
0x08 4 uint32 is_latest_version
0x0C 4 uint32 unk0xc
──────────────────────────────────
16 total
DLC - 50 bytes (0x32)¶
Raw bytes. Notable fields:
data[1]- Shadow of the Erdtree entry flag. Non-zero = character has entered the DLC area. Causes infinite loading if DLC is not owned.data[3:50]- Unused. Should be all0x00. Non-zero values indicate corruption.
PS5Activity - 32 bytes (0x20)¶
Raw bytes. PlayStation-specific activity data.
PlayerGameDataHash - 128 bytes (0x80)¶
Integrity hash computed from player data and equipment.
Offset Size Field
──────────────────────────────────────────────
0x00 4 level
0x04 4 stats
0x08 4 archetype
0x0C 4 playergame_data_0xc0
0x10 4 padding
0x14 4 runes
0x18 4 runes_memory
0x1C 4 equipped_weapons
0x20 4 equipped_armors_and_talismans
0x24 4 equipped_items
0x28 4 equipped_spells
0x2C 84 rest
──────────────────────────────────────────────
128 total
USER_DATA_10¶
Located at 0x19003A0 (PC). Size: 0x60010 bytes including checksum.
Offset Size Field
──────────────────────────────────────────────────────
0x00 16 checksum (MD5, PC only)
0x10 8 steam_id (uint64)
0x18 ... ProfileSummary (10 × 0x24C = 5,880 bytes)
... 10 active_slots (uint8[10], 1=in use 0=empty)
──────────────────────────────────────────────────────
Profile - 0x24C (588 bytes) per slot:
Offset Size Field
──────────────────────────────────────────────────
0x00 32 character_name (UTF-16LE, 16 chars)
0x20 4 level (uint32)
0x24 4 seconds_played (uint32)
0x120 ... face_data (FaceData, 0x120 bytes in profile context)
... additional fields
──────────────────────────────────────────────────
0x24C total
USER_DATA_11¶
Located at 0x1F003B0 (PC). Size: 0x240010 bytes including checksum.
Game regulation data (item stats, scaling, balance). Not edited by the save editor. MD5 checksum at start (PC only), followed by 0x240000 bytes of regulation blob.
Checksums¶
MD5, PC only. Applied to each character slot and both USER_DATA sections.
import hashlib
def recalculate(slot_data: bytes) -> bytes:
# Skip first 16 bytes (existing checksum), hash the rest
return hashlib.md5(slot_data[0x10:]).digest()
The parser tracks slot offsets dynamically during read. Checksums are recalculated using those tracked offsets, not hardcoded values.
| Section | Checksum at | Data from | Data size |
|---|---|---|---|
| Slot 0 | 0x300 | 0x310 | 0x280000 |
| Slot 1 | 0x280310 | 0x280320 | 0x280000 |
| ... | ... | ... | 0x280000 |
| Slot 9 | 0x1680390 | 0x16803A0 | 0x280000 |
| UD10 | 0x19003A0 | 0x19003B0 | 0x60000 |
| UD11 | 0x1F003B0 | 0x1F003C0 | 0x240000 |