pub struct SqpkAddData {
pub target_file: SqpackFile,
pub block_offset: u64,
pub data_bytes: u64,
pub block_delete_number: u64,
pub data: Vec<u8>,
}Expand description
SQPK A command body: write an inline data payload into a .dat file,
then zero a trailing region.
The A command is the primary mechanism for patching game data. It carries
its payload inline in the patch file: the bytes at data[0..data_bytes] are
written to the resolved .dat file starting at block_offset, and then
block_delete_number additional bytes are zeroed out immediately after the
payload. This zeroing step logically marks the trailing range of blocks as
deleted / available.
§Wire format (all big-endian)
┌────────────────────────────────────────────────────────────────────────┐
│ <padding> : [u8; 3] (reserved, always zero) │ bytes 0–2
│ main_id : u16 BE │ bytes 3–4
│ sub_id : u16 BE │ bytes 5–6
│ file_id : u32 BE │ bytes 7–10
│ block_offset_raw : u32 BE multiply by 128 to get byte offset │ bytes 11–14
│ data_bytes_raw : u32 BE multiply by 128 to get payload size │ bytes 15–18
│ block_delete_number_raw: u32 BE multiply by 128 to get zero length │ bytes 19–22
│ data : [u8; data_bytes] inline payload │ bytes 23–…
└────────────────────────────────────────────────────────────────────────┘All three raw u32 size/offset fields are in 128-byte SqPack block units
and are multiplied by 128 (<< 7) during parsing; the decoded fields
(block_offset, data_bytes, block_delete_number) are already in bytes.
§Reference
See SqpkAddData.cs in the XIVLauncher reference implementation.
§Errors
Parsing returns crate::ZiPatchError::BinrwError if the body is too
short to contain the fixed header or the declared data_bytes payload.
Fields§
§target_file: SqpackFileSqPack file to write into.
Preceded by 3 bytes of alignment padding in the wire format.
block_offset: u64Byte offset within the target .dat file at which to begin writing.
Decoded from a raw big-endian u32 by multiplying by 128 (raw << 7).
The raw value is in 128-byte SqPack block units.
data_bytes: u64Length in bytes of the inline data payload.
Decoded from a raw big-endian u32 by multiplying by 128 (raw << 7).
Used to determine how many bytes to read into data.
block_delete_number: u64Number of bytes to zero immediately after writing data.
Decoded from a raw big-endian u32 by multiplying by 128 (raw << 7).
If non-zero, the apply layer writes this many zero bytes starting at
block_offset + data_bytes, logically marking those blocks as freed.
data: Vec<u8>Inline data payload of exactly data_bytes bytes.
Written verbatim to the target .dat file at block_offset. The
content is raw SqPack block data — compressed game assets, index
tables, etc. — as the game engine expects them.
Implementations§
Source§impl SqpkAddData
impl SqpkAddData
Sourcepub const DATA_SOURCE_OFFSET: u64 = SQPK_ADDDATA_HEADER_SIZE
pub const DATA_SOURCE_OFFSET: u64 = SQPK_ADDDATA_HEADER_SIZE
Byte offset of the data field within the SQPK
command body slice (i.e. the byte slice starting after the SQPK
inner_size + sub-command tag).
This constant (23) is the size of the fixed header preceding the inline
payload: 3 bytes padding + 8 bytes SqpackFile + 4 + 4 + 4 bytes for
the three raw size/offset u32s.
Adding this constant to the chunk’s absolute position in the patch file
gives the patch-file offset where data begins — the value needed for
IndexedZiPatch random-access reads that skip decompressing the full
patch stream.
Trait Implementations§
Source§impl BinRead for SqpkAddData
impl BinRead for SqpkAddData
Source§fn read_options<R: Read + Seek>(
__binrw_generated_var_reader: &mut R,
__binrw_generated_var_endian: Endian,
__binrw_generated_var_arguments: Self::Args<'_>,
) -> BinResult<Self>
fn read_options<R: Read + Seek>( __binrw_generated_var_reader: &mut R, __binrw_generated_var_endian: Endian, __binrw_generated_var_arguments: Self::Args<'_>, ) -> BinResult<Self>
Source§fn read<R>(reader: &mut R) -> Result<Self, Error>
fn read<R>(reader: &mut R) -> Result<Self, Error>
Self from the reader using default arguments. Read moreSource§fn read_be<R>(reader: &mut R) -> Result<Self, Error>
fn read_be<R>(reader: &mut R) -> Result<Self, Error>
Self from the reader using default arguments and assuming
big-endian byte order. Read moreSource§fn read_le<R>(reader: &mut R) -> Result<Self, Error>
fn read_le<R>(reader: &mut R) -> Result<Self, Error>
Self from the reader using default arguments and assuming
little-endian byte order. Read moreSource§fn read_ne<R>(reader: &mut R) -> Result<Self, Error>
fn read_ne<R>(reader: &mut R) -> Result<Self, Error>
T from the reader assuming native-endian byte order. Read moreSource§fn read_args<R>(reader: &mut R, args: Self::Args<'_>) -> Result<Self, Error>
fn read_args<R>(reader: &mut R, args: Self::Args<'_>) -> Result<Self, Error>
Self from the reader using the given arguments. Read moreSource§fn read_be_args<R>(reader: &mut R, args: Self::Args<'_>) -> Result<Self, Error>
fn read_be_args<R>(reader: &mut R, args: Self::Args<'_>) -> Result<Self, Error>
Self from the reader, assuming big-endian byte order, using the
given arguments. Read moreSource§impl Clone for SqpkAddData
impl Clone for SqpkAddData
Source§fn clone(&self) -> SqpkAddData
fn clone(&self) -> SqpkAddData
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for SqpkAddData
impl Debug for SqpkAddData
Source§impl PartialEq for SqpkAddData
impl PartialEq for SqpkAddData
Source§fn eq(&self, other: &SqpkAddData) -> bool
fn eq(&self, other: &SqpkAddData) -> bool
self and other values to be equal, and is used by ==.