2023-08-26 14:23:33 +08:00
<!DOCTYPE html>
< link rel = "stylesheet" type = "text/css" href = "CKStateChunk.css" / >
< script src = "CKStateChunk.js" > < / script >
< body >
< h1 > CKStateChunk Data Structure< / h1 >
< p >
NOTE:< br / >
"Fill Zero" mean that this field still is existed but you should fill zero for it.< br / >
"Skip" mean that this field is entirely not existed. You should not consider it anymore.
< / p >
< h2 > Buffer Format< / h2 >
< p >
This section will introduce the buffer format of CKStateChunk.< br / >
Buffer format is the real format of CKStateChunk stored in file.< br / >
< code > CKStateChunk::ConvertFromBuffer< / code > and < code > CKStateChunk::ConvertToBuffer< / code > can convert between CKStateChunk and its buffer format.
< / p >
< p > According to the value of CK_STATECHUNK_CHUNKVERSION, we split it into 3 different format.< / p >
< ul >
< li > value < CHUNK_VERSION2: Very Old Format< / li >
< li > value = CHUNK_VERSION2: Old Format< / li >
< li > value > CHUNK_VERSION2: New Format< / li >
< / ul >
< p >
The unit of m_DataDwSize is CKDWORD(uint32), not char(uint8).< br / >
The core data of CKStateChunk is aligned with 4 byte boundary. so this is the reason why the unit of
m_DataDwSize is CKDWORD.< br / >
Every reading and writing of m_pData should notice this unit issue.
< / p >
< h3 > Very Old Format< / h3 >
< table >
< tr >
< td id = "buf-fmt-vold-DataVersion" >
< code > uint16 m_DataVersion< / code >
< p > The type of m_DataVersion is CK_STATECHUNK_DATAVERSION.< / p >
< / td >
< td id = "buf-fmt-vold-ChunkVersion" >
< code > uint16 m_ChunkVersion< / code >
< p > The type of m_ChunkVersion is CK_STATECHUNK_CHUNKVERSION.< / p >
< / td >
< td id = "buf-fmt-vold-ClassId" >
< code > uint32 m_ClassId< / code >
< p > The type of m_ClassId is CK_CLASSID.< / p >
< / td >
< td id = "buf-fmt-vold-DataDwSize" >
< code > uint32 m_DataDwSize< / code >
< p > The size of CKStateChunk core data.< / p >
< / td >
< td id = "buf-fmt-vold-ObjectListSize" >
< code > uint32 m_ObjectListSize< / code >
< p > The size of object list.< / p >
< / td >
< td id = "buf-fmt-vold-ChunkListSize" >
< code > uint32 m_ChunkListSize< / code >
< p > The size of chunk list< / p >
< / td >
< td id = "buf-fmt-vold-pData" >
< code > uint32[] m_pData< / code >
< p > The core data. Its length is indicated by m_DataDwSize.< / p >
< / td >
< td id = "buf-fmt-vold-ObjectList" >
< code > uint32[] m_ObjectList< / code >
< p > The object list. Its length is indicated by m_ObjectListSize.< / p >
< / td >
< td id = "buf-fmt-vold-ChunkList" >
< code > uint32[] m_ChunkList< / code >
< p > The chunk list. Its length is indicated by m_ChunkListSize.< / p >
< / td >
< / tr >
< / table >
< h3 > Old Format< / h3 >
< table >
< tr >
< td class = "ph" target = "buf-fmt-vold-DataVersion" > < / td >
< td class = "ph" target = "buf-fmt-vold-ChunkVersion" > < / td >
< td class = "ph" target = "buf-fmt-vold-ClassId" > < / td >
< td class = "ph" target = "buf-fmt-vold-DataDwSize" > < / td >
< td class = "ph" target = "buf-fmt-vold-ObjectListSize" > < / td >
< td class = "ph" target = "buf-fmt-vold-ChunkListSize" > < / td >
< td >
< code > uint32 m_ManagerListSize< / code >
< p > The size of manager list< / p >
< / td >
< td class = "ph" target = "buf-fmt-vold-pData" > < / td >
< td class = "ph" target = "buf-fmt-vold-ObjectList" > < / td >
< td class = "ph" target = "buf-fmt-vold-ChunkList" > < / td >
< td >
< code > uint32[] m_ManagerList< / code >
< p > The manager list. Its length is indicated by m_ManagerListSize.< / p >
< / td >
< / tr >
< / table >
< h3 > New Format< / h3 >
< table >
< tr >
< td >
< code > uint8 m_DataVersion< / code >
< p > The type of m_DataVersion is CK_STATECHUNK_DATAVERSION.< / p >
< / td >
< td >
< code > uint8 m_ClassId< / code >
< p > The type of m_ClassId is CK_CLASSID.< / p >
< / td >
< td >
< code > uint8 m_ChunkVersion< / code >
< p > The type of m_ChunkVersion is CK_STATECHUNK_CHUNKVERSION.< / p >
< / td >
< td >
< code > uint8 m_Options< / code >
< p > The type of m_Options is CK_STATECHUNK_CHUNKOPTIONS.< / p >
< / td >
< td >
< code > uint32 m_DataDwSize< / code >
< p > The size of CKStateChunk core data.< / p >
< / td >
< td >
< code > uint32[] m_pData< / code >
< p > The core data. Its length is indicated by m_DataDwSize.< / p >
< / td >
< td >
< table >
< tr >
< td > < code > uint32 m_ObjectListSize< / code > < / td >
< td > < code > uint32[] m_ObjectList< / code > < / td >
< / tr >
< / table >
< p > Enabled when m_Options has CHNK_OPTION_IDS. Skip if not have.< / p >
< / td >
< td >
< table >
< tr >
< td > < code > uint32 m_ChunkListSize< / code > < / td >
< td > < code > uint32[] m_ChunkList< / code > < / td >
< / tr >
< / table >
< p > Enabled when m_Options has CHNK_OPTION_CHN. Skip if not have.< / p >
< / td >
< td >
< table >
< tr >
< td > < code > uint32 m_ManagerListSize< / code > < / td >
< td > < code > uint32[] m_ManagerList< / code > < / td >
< / tr >
< / table >
< p > Enabled when m_Options has CHNK_OPTION_MAN. Skip if not have.< / p >
< / td >
< / tr >
< / table >
< h2 > Core Data Format< / h2 >
< p >
This section introduce the format of CKStateChunk core data, the format of < code > m_pData< / code > .< br / >
The core data is filled by various Identifiers following various data.< br / >
It is related to the function of CKStateChunk.
< / p >
< table >
< tr >
< td >
< table id = "core-data-fmt-item" >
< tr >
< td > < code > uint32 m_Identifier< / code > < / td >
< td > < code > uint32 m_NextIdentifier< / code > < / td >
2023-11-05 10:44:11 +08:00
< td > < code > uint32[] m_Payload< / code > < / td >
2023-08-26 14:23:33 +08:00
< / tr >
< / table >
< p >
A single identifier area.< br / >
m_Identifier is the unique magic word of this identifier area for CKStateChunk locating this area.< br / >
2023-11-05 10:44:11 +08:00
m_NextIdentifier is a relative pointer. It point to the m_Identifier in next identifier area and is relative to the start of core data.< br / >
Thus, the size of each identifier area can be simply computed by the absolute diff to adjacent m_NextIdentifier (< code > *m_pData[pos] - pos< / code > )< br / >
2023-08-26 14:23:33 +08:00
m_Payload is the data of this identifier area and can be read or written by various CKStateChunk read write functions.< br / >
2023-11-05 10:44:11 +08:00
The minimum block size of m_Payload is uint32. It mean that all data must be aligned to uint32 boundary when saving.
2023-08-26 14:23:33 +08:00
< / p >
< / td >
< td >
< table class = "ph" target = "core-data-fmt-item" > < / table >
< / td >
< td >
< code > ...< / code >
< p > More identifier area as much as you like.< / p >
< / td >
< td >
< table class = "ph" target = "core-data-fmt-item" > < / table >
< p > The last m_NextIdentifier should set to zero to indicate the end of the series of identifier area.< / p >
< / td >
< / tr >
< / table >
< h2 > SubChunk Format< / h2 >
< p > According to the value of CK_STATECHUNK_CHUNKVERSION, we split it into 3 different format.< / p >
< ul >
< li > value < CHUNK_VERSION1: Very Old Format< / li >
< li > value = CHUNK_VERSION1: Old Format< / li >
< li > value > CHUNK_VERSION1: New Format< / li >
< / ul >
< h3 > Very Old Format< / h3 >
< table >
< tr >
< td id = "subchk-fmt-vold-SubChunkSize" >
< code > uint32 m_SubChunkSize< / code >
< p > The sum of all following variables' size.< / p >
< / td >
< td id = "subchk-fmt-vold-ClassId" >
< code > uint32 m_ClassId< / code >
< p > The CK_CLASSID of sub chunk.< / p >
< / td >
< td id = "subchk-fmt-vold-DataDwSize" >
< code > uint32 m_DataDwSize< / code >
< p > The size of core data in sub chunk.< / p >
< / td >
< td >
< code > < i > uint32 Blank< / i > < / code >
< p > A blank. I don't know why< / p >
< / td >
< td id = "subchk-fmt-vold-pData" >
< code > uint32[] m_pData< / code >
< p > The core data. Its length is indicated by m_DataDwSize.< / p >
< / td >
< / tr >
< / table >
< h3 > Old Format< / h3 >
< table >
< tr >
< td class = "ph" target = "subchk-fmt-vold-SubChunkSize" > < / td >
< td class = "ph" target = "subchk-fmt-vold-ClassId" > < / td >
< td id = "subchk-fmt-old-DataVersion" >
< code > uint16 m_DataVersion< / code >
< p > The CK_STATECHUNK_DATAVERSION of sub chunk.< / p >
< / td >
< td id = "subchk-fmt-old-ChunkVersion" >
< code > uint16 m_ChunkVersion< / code >
< p > The CK_STATECHUNK_CHUNKVERSION of sub chunk.< / p >
< / td >
< td class = "ph" target = "subchk-fmt-vold-DataDwSize" > < / td >
< td id = "subchk-fmt-old-ObjectListSize" >
< code > uint32 m_ObjectListSize< / code >
< p > The size of sub chunk object list.< / p >
< / td >
< td id = "subchk-fmt-old-ChunkListSize" >
< code > uint32 m_ChunkListSize< / code >
< p > The size of sub chunk chunk list< / p >
< / td >
< td class = "ph" target = "subchk-fmt-vold-pData" > < / td >
< td id = "subchk-fmt-old-ObjectList" >
< code > uint32[] m_ObjectList< / code >
< p > The object list. Its length is indicated by m_ObjectListSize.< / p >
< / td >
< td id = "subchk-fmt-old-ChunkList" >
< code > uint32[] m_ChunkList< / code >
< p > The chunk list. Its length is indicated by m_ChunkListSize.< / p >
< / td >
< / tr >
< / table >
< h3 > New Format< / h3 >
< table >
< tr >
< td class = "ph" target = "subchk-fmt-vold-SubChunkSize" > < / td >
< td class = "ph" target = "subchk-fmt-vold-ClassId" > < / td >
< td class = "ph" target = "subchk-fmt-old-DataVersion" > < / td >
< td class = "ph" target = "subchk-fmt-old-ChunkVersion" > < / td >
< td class = "ph" target = "subchk-fmt-vold-DataDwSize" > < / td >
< td class = "ph" target = "subchk-fmt-old-ObjectListSize" > < / td >
< td class = "ph" target = "subchk-fmt-old-ChunkListSize" > < / td >
< td >
< code > uint32 m_ManagerListSize< / code >
< p > The size of sub chunk manager list< / p >
< / td >
< td class = "ph" target = "subchk-fmt-vold-pData" > < / td >
< td class = "ph" target = "subchk-fmt-old-ObjectList" > < / td >
< td class = "ph" target = "subchk-fmt-old-ChunkList" > < / td >
< td >
< code > uint32[] m_ManagerList< / code >
< p > The manager list. Its length is indicated by m_ManagerListSize.< / p >
< / td >
< / tr >
< / table >
< / body >